commit 0cd2ad64764d260e9165ea60f35d93e5993da38e Author: Alex Shinn Date: Fri Apr 20 23:48:57 2012 +0900 fixing (atan x 0) case which previously performed divide-by-zero diff --git a/.hgignore b/.hgignore new file mode 100644 index 00000000..30e9f961 --- /dev/null +++ b/.hgignore @@ -0,0 +1,39 @@ +syntax: glob +*~ +*.i +*.s +*.o +*.so +*.sch +*.sps +*.txt +*.image +*.wav +*.dylib +*.class +*.dSYM +*.orig +.hg +junk* +*.tgz +*.tar.gz +*.tar.bz2 +*.log +*.err +*.out +gc +gc6.8 +clibs.c +chibi-scheme +chibi-scheme-static +include/chibi/install.h +lib/chibi/filesystem.c +lib/chibi/io/io.c +lib/chibi/net.c +lib/chibi/process.c +lib/chibi/system.c +lib/chibi/time.c +lib/chibi/stty.c +doc/*.html +doc/lib/chibi/*.html +misc/* diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000..f8fb429f --- /dev/null +++ b/AUTHORS @@ -0,0 +1,36 @@ +Alex Shinn wrote the initial version of chibi-scheme and all +distributed modules. + +The `dynamic-wind' implementation is adapted from the implementation +in the appendix to the Scheme48 reference manual, reportedly first +written by Chris Hanson and John Lamping. + +Thanks to the following people for patches and bug reports: + + * Alan Watson + * Alexander Shendi + * Andreas Rottman + * Bakul Shah + * Bruno Deferrari + * Doug Currie + * Derrick Eddington + * Dmitry Chestnykh + * Eduardo Cavazos + * Felix Winkelmann + * Gregor Klinke + * Jeremy Wolff + * Jeronimo Pellegrini + * John Cowan + * John Samsa + * Lars J Aas + * Lorenzo Campedelli + * Michal Kowalski (sladegen) + * Rajesh Krishnan + * Taylor Venable + * Travis Cross + * Zhang Meng + +If you would prefer not to be listed, or are one of the users listed +without a full name, please contact me. If you've made a contribution +and are not listed, please accept my apologies and contact me +immediately! diff --git a/COPYING b/COPYING new file mode 100644 index 00000000..1fcee28e --- /dev/null +++ b/COPYING @@ -0,0 +1,24 @@ +Copyright (c) 2009 Alex Shinn +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..5fdb6ea7 --- /dev/null +++ b/Makefile @@ -0,0 +1,306 @@ +# -*- makefile-gmake -*- + +.PHONY: dist mips-dist cleaner test checkdefs +.DEFAULT_GOAL := all + +CHIBI_FFI ?= $(CHIBI) tools/chibi-ffi +CHIBI_FFI_DEPENDENCIES ?= $(CHIBI_DEPENDENCIES) tools/chibi-ffi + +CHIBI_DOC ?= $(CHIBI) tools/chibi-doc +CHIBI_DOC_DEPENDENCIES ?= $(CHIBI_DEPENDENCIES) tools/chibi-doc + +GENSTATIC ?= ./tools/chibi-genstatic + +CHIBI ?= LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./chibi-scheme$(EXE) +CHIBI_DEPENDENCIES = ./chibi-scheme$(EXE) + +######################################################################## + +CHIBI_COMPILED_LIBS = lib/chibi/filesystem$(SO) lib/chibi/process$(SO) \ + lib/chibi/time$(SO) lib/chibi/system$(SO) lib/chibi/stty$(SO) \ + lib/chibi/weak$(SO) lib/chibi/heap-stats$(SO) lib/chibi/disasm$(SO) \ + lib/chibi/net$(SO) +CHIBI_IO_COMPILED_LIBS = lib/chibi/io/io$(SO) +CHIBI_OPT_COMPILED_LIBS = lib/chibi/optimize/rest$(SO) \ + lib/chibi/optimize/profile$(SO) +COMPILED_LIBS = $(CHIBI_COMPILED_LIBS) $(CHIBI_IO_COMPILED_LIBS) \ + $(CHIBI_OPT_COMPILED_LIBS) lib/srfi/18/threads$(SO) \ + lib/srfi/27/rand$(SO) lib/srfi/33/bit$(SO) lib/srfi/39/param$(SO) \ + lib/srfi/69/hash$(SO) lib/srfi/95/qsort$(SO) lib/srfi/98/env$(SO) \ + lib/scheme/time$(SO) + +BASE_INCLUDES = include/chibi/sexp.h include/chibi/features.h include/chibi/install.h include/chibi/bignum.h +INCLUDES = $(BASE_INCLUDES) include/chibi/eval.h + +MODULE_DOCS := ast disasm equiv filesystem generic heap-stats io loop \ + match mime modules net pathname process repl scribble stty \ + system test time trace type-inference uri weak + +HTML_LIBS = $(MODULE_DOCS:%=doc/lib/chibi/%.html) + +######################################################################## + +include Makefile.libs + +######################################################################## +# Library config. +# +# This is to allow "make SEXP_USE_BOEHM=1" and "make SEXP_USE_DL=0" to +# automatically include the necessary compiler and linker flags in +# addition to setting those features. If not using GNU make just +# comment out the ifs and use the else branches for the defaults. + +ifeq ($(SEXP_USE_BOEHM),1) +GCLDFLAGS := -lgc +XCPPFLAGS := $(CPPFLAGS) -Iinclude $(D:%=-DSEXP_USE_%) -DSEXP_USE_BOEHM=1 +else +GCLDFLAGS := +XCPPFLAGS := $(CPPFLAGS) -Iinclude $(D:%=-DSEXP_USE_%) +endif + +ifeq ($(SEXP_USE_DL),0) +XLDFLAGS := $(LDFLAGS) $(RLDFLAGS) $(GCLDFLAGS) -lm +XCFLAGS := -Wall -DSEXP_USE_DL=0 -g -g3 -Os $(CFLAGS) +else +XLDFLAGS := $(LDFLAGS) $(RLDFLAGS) $(GCLDFLAGS) $(LIBDL) -lm +XCFLAGS := -Wall -g -g3 -Os $(CFLAGS) +endif + +######################################################################## + +all: chibi-scheme$(EXE) all-libs lib/chibi/ast$(SO) + +include/chibi/install.h: Makefile + echo '#define sexp_so_extension "'$(SO)'"' > $@ + echo '#define sexp_default_module_path "'$(MODDIR):$(BINMODDIR)'"' >> $@ + echo '#define sexp_platform "'$(PLATFORM)'"' >> $@ + echo '#define sexp_version "'`cat VERSION`'"' >> $@ + echo '#define sexp_release_name "'`cat RELEASE`'"' >> $@ + +sexp.o: sexp.c gc.c opt/bignum.c $(BASE_INCLUDES) Makefile + $(CC) -c $(XCPPFLAGS) $(XCFLAGS) $(CLIBFLAGS) -o $@ $< + +sexp-ulimit.o: sexp.c gc.c opt/bignum.c $(BASE_INCLUDES) Makefile + $(CC) -c $(XCPPFLAGS) $(XCFLAGS) $(CLIBFLAGS) -DSEXP_USE_LIMITED_MALLOC -o $@ $< + +eval.o: eval.c opcodes.c vm.c opt/simplify.c $(INCLUDES) Makefile + $(CC) -c $(XCPPFLAGS) $(XCFLAGS) $(CLIBFLAGS) -o $@ $< + +main.o: main.c $(INCLUDES) Makefile + $(CC) -c $(XCPPFLAGS) $(XCFLAGS) -o $@ $< + +libchibi-sexp$(SO): sexp.o + $(CC) $(CLIBFLAGS) -o $@ $^ $(XLDFLAGS) + +libchibi-scheme$(SO): eval.o sexp.o + $(CC) $(CLIBFLAGS) -o $@ $^ $(XLDFLAGS) + +chibi-scheme$(EXE): main.o libchibi-scheme$(SO) + $(CC) $(XCPPFLAGS) $(XCFLAGS) -o $@ $< -L. -lchibi-scheme + +chibi-scheme-static$(EXE): main.o eval.o sexp.o + $(CC) $(XCFLAGS) $(STATICFLAGS) -o $@ $^ $(LDFLAGS) $(GCLDFLAGS) -lm + +chibi-scheme-ulimit$(EXE): main.o eval.o sexp-ulimit.o + $(CC) $(XCFLAGS) $(STATICFLAGS) -o $@ $^ $(LDFLAGS) $(GCLDFLAGS) -lm + +clibs.c: $(GENSTATIC) chibi-scheme$(EXE) + $(FIND) lib -name \*.sld | $(CHIBI) $(GENSTATIC) > $@ + +# A special case, this needs to be linked with the LDFLAGS in case +# we're using Boehm. +lib/chibi/ast$(SO): lib/chibi/ast.c $(INCLUDES) + -$(CC) $(CLIBFLAGS) $(XCPPFLAGS) $(XCFLAGS) -o $@ $< $(XLDFLAGS) -L. -lchibi-scheme + +doc/lib/chibi/%.html: lib/chibi/%.sld $(CHIBI_DOC_DEPENDENCIES) + $(CHIBI_DOC) chibi.$* > $@ + +doc: doc/chibi.html doc-libs + +%.html: %.scrbl $(CHIBI_DOC_DEPENDENCIES) + $(CHIBI_DOC) $< > $@ + +clean: clean-libs + -$(RM) *.o *.i *.s *.8 tests/basic/*.out tests/basic/*.err + +cleaner: clean + -$(RM) chibi-scheme$(EXE) chibi-scheme-static$(EXE) chibi-scheme-ulimit$(EXE) \ + libchibi-scheme$(SO) *.a include/chibi/install.h \ + $(shell $(FIND) lib -name \*.o) + +dist-clean: dist-clean-libs cleaner + +checkdefs: + @for d in $(D); do \ + if ! $(GREP) -q " SEXP_USE_$${d%%=*} " include/chibi/features.h; then \ + echo "WARNING: unknown definition $$d"; \ + fi; \ + done + +test-basic: chibi-scheme$(EXE) + @for f in tests/basic/*.scm; do \ + $(CHIBI) -xscheme $$f >$${f%.scm}.out 2>$${f%.scm}.err; \ + if $(DIFF) -q $(DIFFOPTS) $${f%.scm}.out $${f%.scm}.res; then \ + echo "[PASS] $${f%.scm}"; \ + else \ + echo "[FAIL] $${f%.scm}"; \ + fi; \ + done + +test-memory: chibi-scheme-ulimit$(EXE) + ./tests/memory/memory-tests.sh + +test-build: + MAKE=$(MAKE) ./tests/build/build-tests.sh + +test-threads: chibi-scheme$(EXE) lib/srfi/18/threads$(SO) lib/srfi/39/param$(SO) lib/srfi/98/env$(SO) lib/chibi/ast$(SO) lib/chibi/time$(SO) + $(CHIBI) -xscheme tests/thread-tests.scm + +test-numbers: chibi-scheme$(EXE) + $(CHIBI) -xscheme tests/numeric-tests.scm + +test-flonums: chibi-scheme$(EXE) + $(CHIBI) -xscheme tests/flonum-tests.scm + +test-hash: chibi-scheme$(EXE) lib/srfi/69/hash$(SO) + $(CHIBI) -xscheme tests/hash-tests.scm + +test-io: chibi-scheme$(EXE) lib/chibi/io/io$(SO) + $(CHIBI) -xscheme tests/io-tests.scm + +test-match: chibi-scheme$(EXE) + $(CHIBI) -xscheme tests/match-tests.scm + +test-loop: chibi-scheme$(EXE) + $(CHIBI) -xscheme tests/loop-tests.scm + +test-sort: chibi-scheme$(EXE) lib/srfi/33/bit$(SO) + $(CHIBI) -xscheme tests/sort-tests.scm + +test-srfi-1: chibi-scheme$(EXE) + $(CHIBI) -xscheme tests/srfi-1-tests.scm + +test-records: chibi-scheme$(EXE) + $(CHIBI) -xscheme tests/record-tests.scm + +test-weak: chibi-scheme$(EXE) lib/chibi/weak$(SO) + $(CHIBI) -xscheme tests/weak-tests.scm + +test-unicode: chibi-scheme$(EXE) + $(CHIBI) -xscheme tests/unicode-tests.scm + +test-process: chibi-scheme$(EXE) lib/chibi/process$(SO) + $(CHIBI) -xscheme tests/process-tests.scm + +test-system: chibi-scheme$(EXE) lib/chibi/system$(SO) + $(CHIBI) -xscheme tests/system-tests.scm + +test-libs: chibi-scheme$(EXE) + $(CHIBI) -xscheme tests/lib-tests.scm + +test: chibi-scheme$(EXE) + $(CHIBI) -xscheme tests/r5rs-tests.scm + +install: all + $(MKDIR) $(DESTDIR)$(BINDIR) + $(INSTALL) chibi-scheme$(EXE) $(DESTDIR)$(BINDIR)/ + $(INSTALL) tools/chibi-ffi $(DESTDIR)$(BINDIR)/ + $(INSTALL) tools/chibi-doc $(DESTDIR)$(BINDIR)/ + $(MKDIR) $(DESTDIR)$(MODDIR)/chibi/io $(DESTDIR)$(MODDIR)/chibi/loop $(DESTDIR)$(MODDIR)/chibi/match $(DESTDIR)$(MODDIR)/chibi/net $(DESTDIR)$(MODDIR)/chibi/optimize $(DESTDIR)$(MODDIR)/chibi/term + $(MKDIR) $(DESTDIR)$(MODDIR)/scheme/char + $(MKDIR) $(DESTDIR)$(MODDIR)/srfi/1 $(DESTDIR)$(MODDIR)/srfi/18 $(DESTDIR)$(MODDIR)/srfi/27 $(DESTDIR)$(MODDIR)/srfi/33 $(DESTDIR)$(MODDIR)/srfi/39 $(DESTDIR)$(MODDIR)/srfi/69 $(DESTDIR)$(MODDIR)/srfi/95 $(DESTDIR)$(MODDIR)/srfi/99 $(DESTDIR)$(MODDIR)/srfi/99/records + $(INSTALL) lib/*.scm $(DESTDIR)$(MODDIR)/ + $(INSTALL) lib/chibi/*.sld lib/chibi/*.scm $(DESTDIR)$(MODDIR)/chibi/ + $(INSTALL) lib/chibi/io/*.scm $(DESTDIR)$(MODDIR)/chibi/io/ + $(INSTALL) lib/chibi/loop/*.scm $(DESTDIR)$(MODDIR)/chibi/loop/ + $(INSTALL) lib/chibi/match/*.scm $(DESTDIR)$(MODDIR)/chibi/match/ + $(INSTALL) lib/chibi/net/*.sld lib/chibi/net/*.scm $(DESTDIR)$(MODDIR)/chibi/net/ + $(INSTALL) lib/chibi/optimize/*.sld lib/chibi/optimize/*.scm $(DESTDIR)$(MODDIR)/chibi/optimize/ + $(INSTALL) lib/chibi/term/*.sld lib/chibi/term/*.scm $(DESTDIR)$(MODDIR)/chibi/term/ + $(INSTALL) lib/scheme/*.sld lib/scheme/*.scm $(DESTDIR)$(MODDIR)/scheme/ + $(INSTALL) lib/scheme/char/*.sld $(DESTDIR)$(MODDIR)/scheme/char/ + $(INSTALL) lib/srfi/*.sld lib/srfi/*.scm $(DESTDIR)$(MODDIR)/srfi/ + $(INSTALL) lib/srfi/1/*.scm $(DESTDIR)$(MODDIR)/srfi/1/ + $(INSTALL) lib/srfi/18/*.scm $(DESTDIR)$(MODDIR)/srfi/18/ + $(INSTALL) lib/srfi/27/*.scm $(DESTDIR)$(MODDIR)/srfi/27/ + $(INSTALL) lib/srfi/33/*.scm $(DESTDIR)$(MODDIR)/srfi/33/ + $(INSTALL) lib/srfi/39/*.scm $(DESTDIR)$(MODDIR)/srfi/39/ + $(INSTALL) lib/srfi/69/*.scm $(DESTDIR)$(MODDIR)/srfi/69/ + $(INSTALL) lib/srfi/95/*.scm $(DESTDIR)$(MODDIR)/srfi/95/ + $(INSTALL) lib/srfi/99/*.sld $(DESTDIR)$(MODDIR)/srfi/99/ + $(INSTALL) lib/srfi/99/records/*.sld lib/srfi/99/records/*.scm $(DESTDIR)$(MODDIR)/srfi/99/records/ + $(MKDIR) $(DESTDIR)$(BINMODDIR)/chibi/io/ + $(MKDIR) $(DESTDIR)$(BINMODDIR)/chibi/optimize/ + $(MKDIR) $(DESTDIR)$(BINMODDIR)/scheme/ + $(MKDIR) $(DESTDIR)$(BINMODDIR)/srfi/18 $(DESTDIR)$(BINMODDIR)/srfi/27 $(DESTDIR)$(BINMODDIR)/srfi/33 $(DESTDIR)$(BINMODDIR)/srfi/39 $(DESTDIR)$(BINMODDIR)/srfi/69 $(DESTDIR)$(BINMODDIR)/srfi/95 $(DESTDIR)$(BINMODDIR)/srfi/98 + $(INSTALL) $(CHIBI_COMPILED_LIBS) lib/chibi/ast$(SO) $(DESTDIR)$(BINMODDIR)/chibi/ + $(INSTALL) $(CHIBI_IO_COMPILED_LIBS) $(DESTDIR)$(BINMODDIR)/chibi/io/ + $(INSTALL) $(CHIBI_OPT_COMPILED_LIBS) $(DESTDIR)$(BINMODDIR)/chibi/optimize/ + $(INSTALL) lib/scheme/time$(SO) $(DESTDIR)$(BINMODDIR)/scheme/ + $(INSTALL) lib/srfi/18/threads$(SO) $(DESTDIR)$(BINMODDIR)/srfi/18 + $(INSTALL) lib/srfi/27/rand$(SO) $(DESTDIR)$(BINMODDIR)/srfi/27 + $(INSTALL) lib/srfi/33/bit$(SO) $(DESTDIR)$(BINMODDIR)/srfi/33 + $(INSTALL) lib/srfi/39/param$(SO) $(DESTDIR)$(BINMODDIR)/srfi/39 + $(INSTALL) lib/srfi/69/hash$(SO) $(DESTDIR)$(BINMODDIR)/srfi/69 + $(INSTALL) lib/srfi/95/qsort$(SO) $(DESTDIR)$(BINMODDIR)/srfi/95 + $(INSTALL) lib/srfi/98/env$(SO) $(DESTDIR)$(BINMODDIR)/srfi/98 + $(MKDIR) $(DESTDIR)$(INCDIR) + $(INSTALL) $(INCLUDES) $(DESTDIR)$(INCDIR)/ + $(MKDIR) $(DESTDIR)$(LIBDIR) + $(MKDIR) $(DESTDIR)$(SOLIBDIR) + $(INSTALL) libchibi-scheme$(SO) $(DESTDIR)$(SOLIBDIR)/ + -$(INSTALL) libchibi-scheme.a $(DESTDIR)$(SOLIBDIR)/ + $(MKDIR) $(DESTDIR)$(MANDIR) + $(INSTALL) doc/chibi-scheme.1 $(DESTDIR)$(MANDIR)/ + $(INSTALL) doc/chibi-ffi.1 $(DESTDIR)$(MANDIR)/ + $(INSTALL) doc/chibi-doc.1 $(DESTDIR)$(MANDIR)/ + -if type ldconfig >/dev/null 2>/dev/null; then ldconfig; fi + +uninstall: + -$(RM) $(DESTDIR)$(BINDIR)/chibi-scheme$(EXE) + -$(RM) $(DESTDIR)$(BINDIR)/chibi-scheme-static$(EXE) + -$(RM) $(DESTDIR)$(BINDIR)/chibi-ffi + -$(RM) $(DESTDIR)$(BINDIR)/chibi-doc + -$(RM) $(DESTDIR)$(SOLIBDIR)/libchibi-scheme$(SO) + -$(RM) $(DESTDIR)$(LIBDIR)/libchibi-scheme$(SO).a + -$(CD) $(DESTDIR)$(INCDIR) && $(RM) $(INCLUDES) + -$(RM) $(DESTDIR)$(MODDIR)/srfi/99/records/*.{sld,scm} + -$(RM) $(DESTDIR)$(MODDIR)/*.{sld,scm} $(DESTDIR)$(MODDIR)/*/*.{sld,scm} $(DESTDIR)$(MODDIR)/*/*/*.{sld,scm} + -$(CD) $(DESTDIR)$(MODDIR) && $(RM) $(COMPILED_LIBS:lib/%=%) chibi/ast$(SO) + -$(CD) $(DESTDIR)$(BINMODDIR) && $(RM) $(COMPILED_LIBS:lib/%=%) chibi/ast$(SO) + -$(RMDIR) $(DESTDIR)$(MODDIR)/chibi/io $(DESTDIR)$(BINMODDIR)/chibi/io + -$(RMDIR) $(DESTDIR)$(MODDIR)/chibi/loop $(DESTDIR)$(BINMODDIR)/chibi/loop + -$(RMDIR) $(DESTDIR)$(MODDIR)/chibi/match $(DESTDIR)$(BINMODDIR)/chibi/match + -$(RMDIR) $(DESTDIR)$(MODDIR)/chibi/net $(DESTDIR)$(BINMODDIR)/chibi/net + -$(RMDIR) $(DESTDIR)$(MODDIR)/chibi/optimize $(DESTDIR)$(BINMODDIR)/chibi/optimize + -$(RMDIR) $(DESTDIR)$(MODDIR)/chibi/term $(DESTDIR)$(BINMODDIR)/chibi/term + -$(RMDIR) $(DESTDIR)$(MODDIR)/chibi $(DESTDIR)$(BINMODDIR)/chibi + -$(RMDIR) $(DESTDIR)$(MODDIR)/scheme/char $(DESTDIR)$(BINMODDIR)/scheme/char + -$(RMDIR) $(DESTDIR)$(MODDIR)/scheme $(DESTDIR)$(BINMODDIR)/scheme + -$(RMDIR) $(DESTDIR)$(MODDIR)/srfi/1 $(DESTDIR)$(BINMODDIR)/srfi/1 + -$(RMDIR) $(DESTDIR)$(MODDIR)/srfi/18 $(DESTDIR)$(BINMODDIR)/srfi/18 + -$(RMDIR) $(DESTDIR)$(MODDIR)/srfi/27 $(DESTDIR)$(BINMODDIR)/srfi/27 + -$(RMDIR) $(DESTDIR)$(MODDIR)/srfi/33 $(DESTDIR)$(BINMODDIR)/srfi/33 + -$(RMDIR) $(DESTDIR)$(MODDIR)/srfi/39 $(DESTDIR)$(BINMODDIR)/srfi/39 + -$(RMDIR) $(DESTDIR)$(MODDIR)/srfi/69 $(DESTDIR)$(BINMODDIR)/srfi/69 + -$(RMDIR) $(DESTDIR)$(MODDIR)/srfi/95 $(DESTDIR)$(BINMODDIR)/srfi/95 + -$(RMDIR) $(DESTDIR)$(MODDIR)/srfi/98 $(DESTDIR)$(BINMODDIR)/srfi/98 + -$(RMDIR) $(DESTDIR)$(MODDIR)/srfi/99/records $(DESTDIR)$(BINMODDIR)/srfi/99/records + -$(RMDIR) $(DESTDIR)$(MODDIR)/srfi/99 $(DESTDIR)$(BINMODDIR)/srfi/99 + -$(RMDIR) $(DESTDIR)$(MODDIR)/srfi $(DESTDIR)$(BINMODDIR)/srfi + -$(RMDIR) $(DESTDIR)$(MODDIR) $(DESTDIR)$(BINMODDIR) + -$(RM) $(DESTDIR)$(MANDIR)/chibi-scheme.1 $(DESTDIR)$(MANDIR)/chibi-ffi.1 $(DESTDIR)$(MANDIR)/chibi-doc.1 + +dist: dist-clean + $(RM) chibi-scheme-`cat VERSION`.tgz + $(MKDIR) chibi-scheme-`cat VERSION` + @for f in `hg manifest`; do $(MKDIR) chibi-scheme-`cat VERSION`/`dirname $$f`; $(SYMLINK) `pwd`/$$f chibi-scheme-`cat VERSION`/$$f; done + $(TAR) cphzvf chibi-scheme-`cat VERSION`.tgz chibi-scheme-`cat VERSION` + $(RM) -r chibi-scheme-`cat VERSION` + +mips-dist: dist-clean + $(RM) chibi-scheme-`date +%Y%m%d`-`hg tags|head -1|sed -n 's/.* \([0-9]*\):.*/\1/p'`.tgz + $(MKDIR) chibi-scheme-`date +%Y%m%d`-`hg tags|head -1|sed -n 's/.* \([0-9]*\):.*/\1/p'` + @for f in `hg manifest`; do $(MKDIR) chibi-scheme-`date +%Y%m%d`-`hg tags|head -1|sed -n 's/.* \([0-9]*\):.*/\1/p'`/`dirname $$f`; $(SYMLINK) `pwd`/$$f chibi-scheme-`date +%Y%m%d`-`hg tags|head -1|sed -n 's/.* \([0-9]*\):.*/\1/p'`/$$f; done + $(TAR) cphzvf chibi-scheme-`date +%Y%m%d`-`hg tags|head -1|sed -n 's/.* \([0-9]*\):.*/\1/p'`.tgz chibi-scheme-`date +%Y%m%d`-`hg tags|head -1|sed -n 's/.* \([0-9]*\):.*/\1/p'` + $(RM) -r chibi-scheme-`date +%Y%m%d`-`hg tags|head -1|sed -n 's/.* \([0-9]*\):.*/\1/p'` diff --git a/Makefile.detect b/Makefile.detect new file mode 100644 index 00000000..a65bfc8c --- /dev/null +++ b/Makefile.detect @@ -0,0 +1,78 @@ +# -*- makefile-gmake -*- + +######################################################################## +# Detect the PLATFORM with uname. + +ifndef PLATFORM +ifeq ($(shell uname),Darwin) +PLATFORM=macosx +else +ifeq ($(shell uname),FreeBSD) +PLATFORM=FreeBSD +else +ifeq ($(shell uname -o),Msys) +PLATFORM=mingw +SOLIBDIR = $(BINDIR) +DIFFOPTS = -b +else +ifeq ($(shell uname -o),Cygwin) +PLATFORM=cygwin +SOLIBDIR = $(BINDIR) +DIFFOPTS = -b +else +ifeq ($(shell uname -o),GNU/Linux) +PLATFORM=linux +else +PLATFORM=unix +endif +endif +endif +endif +endif +endif + +######################################################################## +# Set default variables for the platform. + +LIBDL = -ldl + +ifeq ($(PLATFORM),macosx) +SO = .dylib +EXE = +CLIBFLAGS = -dynamiclib +STATICFLAGS = -static-libgcc -DSEXP_USE_DL=0 +else +ifeq ($(PLATFORM),mingw) +SO = .dll +EXE = .exe +CC = gcc +CLIBFLAGS = -shared +CPPFLAGS += -DSEXP_USE_STRING_STREAMS=0 -DBUILDING_DLL +LDFLAGS += -Wl,--out-implib,libchibi-scheme$(SO).a +STATICFLAGS = -DSEXP_USE_DL=0 +LIBDL = +else +ifeq ($(PLATFORM),cygwin) +SO = .dll +EXE = .exe +CC = gcc +CLIBFLAGS = -shared +CPPFLAGS += -DSEXP_USE_STRING_STREAMS=0 +LDFLAGS += -Wl,--out-implib,libchibi-scheme$(SO).a +else +SO = .so +EXE = +CLIBFLAGS = -fPIC -shared +STATICFLAGS = -static -DSEXP_USE_DL=0 +ifeq ($(PLATFORM),FreeBSD) +LIBDL= +RLDFLAGS=-Wl,-R$(DESTDIR)$(LIBDIR) +endif +endif +endif +endif + +ifeq ($(PLATFORM),unix) +#RLDFLAGS=-rpath $(LIBDIR) +RLDFLAGS=-Wl,-R$(LIBDIR) +endif diff --git a/Makefile.libs b/Makefile.libs new file mode 100644 index 00000000..6767d386 --- /dev/null +++ b/Makefile.libs @@ -0,0 +1,89 @@ +# -*- makefile-gmake -*- + +# Include-able makefile for building Chibi libraries - see README.libs +# for usage. + +.PHONY: all all-libs clean clean-libs dist-clean dist-clean-libs install install-libs uninstall uninstall-libs doc doc-libs +.PRECIOUS: %.c + +# install configuration + +CC ?= cc +CD ?= cd +RM ?= rm -f +LS ?= ls +INSTALL ?= install +MKDIR ?= $(INSTALL) -d +RMDIR ?= rmdir +TAR ?= tar +DIFF ?= diff +GREP ?= grep +FIND ?= find +SYMLINK ?= ln -s + +PREFIX ?= /usr/local +BINDIR ?= $(PREFIX)/bin +LIBDIR ?= $(PREFIX)/lib +SOLIBDIR ?= $(PREFIX)/lib +INCDIR ?= $(PREFIX)/include/chibi +MODDIR ?= $(PREFIX)/share/chibi +BINMODDIR ?= $(PREFIX)/lib/chibi +MANDIR ?= $(PREFIX)/share/man/man1 + +DESTDIR ?= + +CHIBI ?= chibi-scheme$(EXE) +CHIBI_FFI ?= chibi-ffi +CHIBI_DOC ?= chibi-doc + +######################################################################## +# System configuration - if not using GNU make, set PLATFORM and the +# flags from Makefile.detect (at least SO, EXE, CLIBFLAGS) as necessary. + +include Makefile.detect + +######################################################################## + +all-libs: $(COMPILED_LIBS) + +lib/%.c: lib/%.stub $(CHIBI_FFI_DEPENDENCIES) + $(CHIBI_FFI) $< + +lib/%$(SO): lib/%.c $(INCLUDES) + $(CC) $(CLIBFLAGS) $(XCPPFLAGS) $(XCFLAGS) -o $@ $< -L. -lchibi-scheme + +doc-libs: $(HTML_LIBS) + +doc/lib/%.html: lib/%.sld + $(MKDIR) $(dir $@) + $(CHIBI_DOC) $(subst /,.,$*) > $@ + +clean-libs: + $(RM) $(COMPILED_LIBS) + $(RM) -r $(patsubst %,%.dSYM,$(COMPILED_LIBS)) + $(RM) $(HTML_LIBS) + +dist-clean-libs: clean-libs + $(RM) $(patsubst %.stub, %.c, $(shell $(FIND) lib -name \*.stub)) + +install-libs: all-libs + for dir in $(dir $(patsubst lib/%,%,$(COMPILED_LIBS))) ; do \ + $(MKDIR) $(DESTDIR)$(BINMODDIR)/$$dir; \ + done + for file in $(patsubst lib/%,%,$(COMPILED_LIBS)) ; do \ + $(INSTALL) lib/$$file $(DESTDIR)$(BINMODDIR)/$$file ; \ + done + for dir in $(dir $(patsubst lib/%,%,$(SCM_LIBS))) ; do \ + $(MKDIR) $(DESTDIR)$(MODDIR)/$$dir; \ + done + for file in $(patsubst lib/%,%,$(SCM_LIBS)) ; do \ + $(INSTALL) lib/$$file $(DESTDIR)$(MODDIR)/$$file ; \ + done + +uninstall-libs: + for file in $(patsubst lib/%,%,$(COMPILED_LIBS)) ; do \ + $(RM) $(DESTDIR)$(BINMODDIR)/$$file ; \ + done + for file in $(patsubst lib/%,%,$(SCM_LIBS)) ; do \ + $(RM) $(DESTDIR)$(MODDIR)/$$file ; \ + done diff --git a/README b/README new file mode 100644 index 00000000..94da7991 --- /dev/null +++ b/README @@ -0,0 +1,33 @@ + + Chibi-Scheme + -------------- + + Minimal Scheme Implementation for use as an Extension Language + + http://synthcode.com/wiki/chibi-scheme/ + +Chibi-Scheme is a very small library intended for use as an extension +and scripting language in C programs. In addition to support for +lightweight VM-based threads, each VM itself runs in an isolated heap +allowing multiple VMs to run simultaneously in different OS threads. + +The default language is an extended subset of the current draft R7RS +Scheme, with support for all libraries. Support for additional +languages such as JavaScript, Go, Lua and Bash are planned for future +releases. Scheme is chosen as a substrate because its first class +continuations and guaranteed tail-call optimization makes implementing +other languages easy. + +To build on most platforms just run "make && make test". This will +provide a shared library "libchibi-scheme", as well as a sample +"chibi-scheme" command-line repl. You can then run + + sudo make PREFIX=/usr/local install + +to install the binaries, leaving out the PREFIX for the default +/usr/local or specifying an alternate install location. If you want +to try out chibi-scheme without installing, be sure to set +LD_LIBRARY_PATH so it can find the shared libraries. + +For more detailed documentation, run "make doc" and see the generated +"doc/chibi.html". diff --git a/README.libs b/README.libs new file mode 100644 index 00000000..2d8fc8ec --- /dev/null +++ b/README.libs @@ -0,0 +1,108 @@ +Using the Makefile.libs File To Build and Install Libraries +----------------------------------------------------------- + +The Makefile.libs file distributed with the Chibi Scheme sources +can facilitate building and installing Chibi Scheme libraries written +in C or Scheme. To use it, follow these instructions: + +1. Copy the Makefile.libs and Makefile.detect files from the Chibi + Scheme source directory to the library source top-level directory. + +2. Place the library source in the subdirectory "lib" of the library + source top-level directory. For example, + + lib/foo/bar.c + lib/foo/bar.h + lib/foo/bar.sld + lib/foo/bar.scm + +3. In the Makefile in the library source top-level directory, define + the following targets: + + all + doc + install + uninstall + clean + dist-clean + + These should depend on the corresponding "-libs" target, but + can include additional commands. For example: + + all: all-libs + install: install-libs + cp -r doc $(PREFIX)/share/chibi/ + uninstall: uninstall-libs + doc: doc-libs + clean: clean-libs + dist-clean: dist-clean-libs + + The all target should be the first target in the Makefile. + + The all-libs target makes the shared libraries in the library. + The doc-libs target generates HTML files for the library. The + install-libs and uninstall-libs targets install and uninstall + the library under the prefix. The clean-libs target removes the + shared libraries and generated HTML files. The dist-clean-libs + removes any .c files generated from .stub files and also performs + a clean-libs. + +4. In the Makefile in the library source top-level directory, define + the following variables: + + COMPILED_LIBS: Any shared libraries that should be built and + installed. The shared library is build from the corresponding + .c or .stub file. The $(SO) variable should be used for the + shared-library suffix; in order for this to work COMPILED_LIBS + should be defined as a recursively-expanded variable (with + =) rather than a simply-expanded variable (with :=). + + INCLUDES: Any other files on which the shared libraries depend. + + SCM_LIBS: Any Scheme source files that should be installed. + + HTML_LIBS: Any HTML files that should be generated. The HTML + files are generated from the corresponding .sld files using + chibi-doc. + + For example, + + COMPILED_LIBS = lib/foo/bar$(SO) + INCLUDES = lib/foo/bar.h + SCM_LIBS = lib/foo/bar.sld lib/foo/bar.scm + HTML_LIBS = doc/lib/foo/bar.html + +5. Add additional flags as necessary to XCPPFLAGS and XCFLAGS. + These flags are passed to the compiler and linker when they + generate the shared library. These should probably include at + least: + + XCPPFLAGS += -I$(PREFIX)/include + XCFLAGS += -L$(PREFIX)/lib + + These additions will ensure that the compiler and linker can + find the Chibi Scheme include and library files, even if they + are installed under a non-standard prefix. + +6. Include the common Makefile using: + + include Makefile.libs + +A complete example is: + + all: all-libs + install: install-libs + uninstall: uninstall-libs + doc: doc-libs + clean: clean-libs + dist-clean: dist-clean-libs + + COMPILED_LIBS = lib/foo/bar$(SO) + INCLUDES = lib/foo/bar.h + SCM_LIBS = lib/foo/bar.sld lib/foo/bar.scm + HTML_LIBS = doc/lib/foo/bar.html + + XCPPFLAGS += -I$(PREFIX)/include + XCFLAGS += -L$(PREFIX)/lib + + include Makefile.libs diff --git a/RELEASE b/RELEASE new file mode 100644 index 00000000..9411ecda --- /dev/null +++ b/RELEASE @@ -0,0 +1 @@ +boron diff --git a/TODO b/TODO new file mode 100644 index 00000000..1d741ce1 --- /dev/null +++ b/TODO @@ -0,0 +1,187 @@ +-*- org -*- + +* compiler +** DONE ast rewrite + - State "DONE" [2009-04-09 Thu 14:32] +** DONE call/cc support + - State "DONE" [2009-04-09 Thu 14:36] +** DONE exceptions + - State "DONE" [2009-04-09 Thu 14:45] +** TODO native x86 backend + API redesign in preparation complete, initial + tests on native factorial and closures working. +** TODO fasl/image files + sexp_copy_context() can form the basis for images, + FASL for arbitrary modules will need additional + help with resolving external references. +*** DONE optional image loading on startup + - State "DONE" from "TODO" [2011-11-10 Thu 20:44] +*** TODO static image compiled into library + With this you'll be able to run Chibi without any filesystem. +*** TODO external tool to compact and optimize images + The current GC is mark&sweep, which can cause fragmentation, + but we can at at least compact the initial fixed image. +*** TODO fasl versions of modules + Important for large applications, and fast loading of script + with many dependencies. +** DONE shared stack on EVAL + - State "DONE" [2009-12-26 Sat 08:22] + +* compiler optimizations +** DONE constant folding + - State "DONE" [2009-12-16 Wed 23:25] +** DONE simplification pass, dead-code elimination + - State "DONE" [2009-12-18 Fri 14:14] + This is important in particular for the output generated by + syntax-rules. +** TODO lambda lift + The current closure representation is not very efficient, so this + would help a lot. +** TODO inlining (and disabling primitive inlining) + Being able to redefine procedures is important though. +** TODO unsafe operations + Possibly, don't want to make things too complicated or unstable. +** TODO plugin infrastructure +** DONE type inference with warnings + - State "DONE" from "TODO" [2010-09-21 Tue 23:18] +*** TODO structured type inference +*** DONE infer error branches + CLOSED: [2011-11-14 Mon 08:17] +*** TODO elide type checks from type information + +* macros +** DONE hygiene + - State "DONE" [2009-04-09 Thu 14:41] +** DONE hygienic nested let-syntax + - State "DONE" [2009-12-08 Tue 14:41] +** DONE macroexpand utility + - State "DONE" [2009-12-08 Tue 14:41] +** DONE SRFI-46 basic syntax-rules extensions + - State "DONE" [2009-12-26 Sat 07:59] +** DONE (... ...) support + - State "DONE" [2009-12-26 Sat 02:06] +** TODO compiler macros +** TODO syntax-rules common pattern reduction +** TODO syntax-rules loop optimization + +* garbage collection +** DONE precise gc rewrite + - State "DONE" [2009-06-22 Mon 14:27] +** DONE fix heap growing + - State "DONE" [2009-06-22 Mon 14:29] +** DONE separate gc heaps + - State "DONE" [2009-12-08 Tue 14:29] +** DONE add finalizers + - State "DONE" [2009-12-08 Tue 14:29] +** DONE support weak references + - State "DONE" from "TODO" [2010-09-21 Tue 23:16] +*** TODO support proper weak key-value references + +* runtime +** DONE bignums + - State "DONE" [2009-07-07 Tue 14:42] +** DONE unicode + - State "DONE" from "TODO" [2010-07-11 Sun 23:58] + Supported with UTF-8 strings, string-ref is O(n) and + string-set! may need to reallocate the whole string. + string-cursor-ref can be used for O(1) string access. +** DONE threads + - State "DONE" from "TODO" [2010-07-11 Sun 15:31] + VM now supports an optional hook for green threads, + and a SRFI-18 interface is provided as a separate module. + I/O operations will currently block all threads though, + this needs to be addressed. +*** DONE thread-local parameters + CLOSED: [2010-12-06 Mon 21:52] +*** TODO efficient priority queues +** DONE virtual ports + - State "DONE" [2010-01-02 Sat 20:12] +** DONE dynamic-wind + - State "DONE" [2009-12-26 Sat 01:51] + Adapted a version from Scheme48. +** DONE recursive disasm + - State "DONE" [2009-12-18 Fri 14:15] + +* FFI +** DONE libdl support + - State "DONE" [2009-12-08 Tue 14:45] +** DONE opcode generation interface + - State "DONE" [2009-11-15 Sun 14:45] +** DONE stub generator + - State "DONE" [2009-12-26 Sat 01:50] +*** DONE define-c-struct + - State "DONE" [2009-11-29 Sun 14:48] +*** DONE define-c + - State "DONE" [2009-11-29 Sun 14:48] +*** DONE array return types + - State "DONE" [2009-12-26 Sat 01:49] +*** DONE pre-buffered string types (like getcwd) + - State "DONE" [2009-12-26 Sat 01:49] + +* module system +** DONE scheme48-like config language + - State "DONE" [2009-10-13 Tue 14:38] +** DONE shared library includes + - State "DONE" [2009-12-08 Tue 14:39] +** DONE only/except/rename/prefix modifiers + - State "DONE" [2009-12-16 Wed 18:57] +** TODO scheme-complete.el support +** DONE access individual modules from repl + - State "DONE" [2009-12-26 Sat 01:49] + +* core modules +** DONE SRFI-0 cond-expand + - State "DONE" [2009-12-16 Wed 20:12] +** DONE SRFI-9 define-record-type + - State "DONE" [2009-12-08 Tue 14:50] +** DONE SRFI-69 hash-tables + - State "DONE" [2009-11-15 Sun 14:50] +** DONE match library + - State "DONE" [2009-12-08 Tue 14:54] +** DONE loop library + - State "DONE" [2009-12-08 Tue 14:54] +** DONE network interface + - State "DONE" from "TODO" [2011-11-10 Thu 20:46] +** DONE posix interface + - State "DONE" from "TODO" [2010-07-11 Sun 15:36] + Splitting this into several parts. +*** DONE filesystem interface + - State "DONE" [2009-12-26 Sat 01:50] +*** DONE process interface + - State "DONE" [2009-12-26 Sat 01:50] +*** DONE time interface + - State "DONE" [2009-12-26 Sat 01:50] +*** DONE host system interface + - State "DONE" [2010-01-02 Sat 20:12] +** DONE pathname library + - State "DONE" [2009-12-16 Wed 18:58] +** DONE uri library + - State "DONE" [2009-12-16 Wed 18:58] +** TODO http library +** TODO show (formatting) library +** TODO zip library +** TODO tar library +** TODO md5sum library + +* ports +** DONE basic mingw support + - State "DONE" [2009-06-22 Mon 14:36] +** DONE Plan 9 support + - State "DONE" [2009-08-10 Mon 14:37] +** DONE 64-bit support + - State "DONE" [2009-11-01 Sun 14:37] +** DONE iPhone support + - State "DONE" from "TODO" [2011-11-10 Thu 20:46] +** TODO bare-metal support + +* miscellaneous +** DONE user documentation + - State "DONE" from "TODO" [2011-11-10 Thu 20:45] +** TODO full test suite for libraries +** TODO thorough source documentation + +* distribution +** TODO packaging format (Snow2) +** TODO code repository with fetch+install tool +** TODO translator to/from other implementations + diff --git a/VERSION b/VERSION new file mode 100644 index 00000000..be14282b --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.5.3 diff --git a/benchmarks/shootout/binarytrees.chibi b/benchmarks/shootout/binarytrees.chibi new file mode 100755 index 00000000..4f35cce3 --- /dev/null +++ b/benchmarks/shootout/binarytrees.chibi @@ -0,0 +1,46 @@ +#! /usr/bin/env chibi-scheme + +;;; The Computer Language Benchmarks Game +;;; http://shootout.alioth.debian.org/ + +(import (scheme) (srfi 9)) + +(define-record-type node + (make-node value left right) + node? + (value node-value node-value-set!) + (left node-left node-left-set!) + (right node-right node-right-set!)) + +(define (make value depth) + (if (zero? depth) + (make-node value #f #f) + (let ((v (* value 2)) + (d (- depth 1))) + (make-node value (make (- v 1) d) (make v d))))) + +(define (check n) + (if n + (+ (node-value n) (- (check (node-left n)) (check (node-right n)))) + 0)) + +(define (print . args) (for-each display args) (newline)) + +(define (main args) + (let* ((n (string->number (cadr args))) + (min-depth 4) + (max-depth (max (+ min-depth 2) n)) + (stretch-depth (+ max-depth 1))) + (print "stretch tree of depth " stretch-depth "\t check: " + (check (make 0 stretch-depth))) + (let ((long-lived-tree (make 0 max-depth))) + (do ((d min-depth (+ d 2))) + ((>= d max-depth)) + (let ((iterations (* 2 (+ (- max-depth d) min-depth)))) + (print (* 2 iterations) "\t trees of depth " d "\t check: " + (do ((i 0 (+ i 1)) + (c 0 (+ c (check (make i d)) (check (make (- i) d))))) + ((>= i iterations) + c))))) + (print "long lived tree of depth " max-depth "\t check: " + (check long-lived-tree))))) diff --git a/benchmarks/shootout/chameneos-redux.chibi b/benchmarks/shootout/chameneos-redux.chibi new file mode 100644 index 00000000..35fe9c28 --- /dev/null +++ b/benchmarks/shootout/chameneos-redux.chibi @@ -0,0 +1,107 @@ +#! /usr/bin/env chibi-scheme + +;;; The Computer Language Benchmarks Game +;;; http://shootout.alioth.debian.org/ + +;;; based on Racket version by Matthew Flatt + +(import (scheme) + (srfi 18) + (chibi match)) + +(define (print . args) + (for-each display args) + (newline)) + +(define (change c1 c2) + (case c1 + ((red) + (case c2 ((blue) 'yellow) ((yellow) 'blue) (else c1))) + ((yellow) + (case c2 ((blue) 'red) ((red) 'blue) (else c1))) + ((blue) + (case c2 ((yellow) 'red) ((red) 'yellow) (else c1))))) + +(let ((colors '(blue red yellow))) + (for-each + (lambda (a) + (for-each + (lambda (b) + (print a " + " b " -> " (change a b))) + colors)) + colors)) + +(define (place meeting-ch n) + (thread-start! + (make-thread + (lambda () + (let loop ((n n)) + (if (<= n 0) + ;; Fade all: + (let loop () + (let ((c (channel-get meeting-ch))) + (channel-put (car c) #f) + (loop))) + ;; Let two meet: + (match-let (((ch1 . v1) (channel-get meeting-ch)) + ((ch2 . v2) (channel-get meeting-ch))) + (channel-put ch1 v2) + (channel-put ch2 v1) + (loop (- n 1))))))))) + +(define (creature color meeting-ch result-ch) + (thread-start! + (make-thread + (lambda () + (let ((ch (make-channel)) + (name (gensym))) + (let loop ((color color) (met 0) (same 0)) + (channel-put meeting-ch (cons ch (cons color name))) + (match (channel-get ch) + ((other-color . other-name) + ;; Meet: + (sleep) ; avoid imbalance from weak fairness + (loop (change color other-color) + (add1 met) + (+ same (if (eq? name other-name) + 1 + 0)))) + (#f + ;; Done: + (channel-put result-ch (cons met same)))))))))) + +(define (spell n) + (for-each + (lambda (i) + (display " ") + (display (vector-ref digits (- (char->integer i) (char->integer #\0))))) + (string->list (number->string n)))) + +(define digits + '#("zero" "one" "two" "three" "four" "five" "six" "seven" "eight" "nine")) + +(define (go n inits) + (let ((result-ch (make-channel)) + (meeting-ch (make-channel))) + (place meeting-ch n) + (newline) + (for-each + (lambda (init) + (print " " init) + (creature init meeting-ch result-ch)) + inits) + (newline) + (let ((results (map (lambda (i) (channel-get result-ch)) inits))) + (for-each + (lambda (r) + (display (car r)) + (spell (cdr r)) + (newline)) + results) + (spell (apply + (map car results))) + (newline)))) + +(let ((n (string->number (cadr (command-line))))) + (go n '(blue red yellow)) + (go n '(blue red yellow red yellow blue red yellow red blue)) + (newline)) diff --git a/benchmarks/shootout/knucleotide-input.txt b/benchmarks/shootout/knucleotide-input.txt new file mode 100644 index 00000000..fd4414b1 --- /dev/null +++ b/benchmarks/shootout/knucleotide-input.txt @@ -0,0 +1,4171 @@ +>ONE Homo sapiens alu +GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA +TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT +AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG +GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG +CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT +GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA +GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA +TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG +AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA +GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT +AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC +AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG +GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC +CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG +AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT +TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA +TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT +GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG +TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT +CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG +CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG +TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA +CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG +AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG +GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC +TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA +TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA +GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT +GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC +ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT +TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC +CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG +CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG +GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC +CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT +GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC +GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA +GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA +GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA +GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG +AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT +CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA +GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA +AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC +GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT +ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG +GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC +GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC +GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG +TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA +AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG +GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT +CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC +TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG +ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC +GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA +ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA +CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA +CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA +ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG +CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG +AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC +CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG +AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC +CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG +CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG +CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG +CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC +ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA +AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC +TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC +ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG +CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG +AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT +AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA +TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC +CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA +TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG +CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT +GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG +GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG +CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG +GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG +GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT +AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT +GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT +CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG +GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC +TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT +CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG +ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG +CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG +AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA +CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG +CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC +ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC +GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC +GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG +GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT +TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG +CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA +GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG +CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC +GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG +CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA +CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG +CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA +ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC +CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT +GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA +AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG +ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC +TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA +GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC +GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG +TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC +AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA +ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA +GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC +AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG +TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC +CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT +GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC +CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA +GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT +TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC +ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC +TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG +GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG +TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG +GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC +GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT +ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC +GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC +GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC +CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA +ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG +AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC +TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT +CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG +TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG +CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC +GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT +GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC +CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC +TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG +CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG +AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG +AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG +AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT +GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA +TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC +AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA +AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG +CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC +TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG +GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT +CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG +CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG +GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA +AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA +GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC +TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC +CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA +GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG +CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG +AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG +ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC +ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC +AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC +GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG +GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT +CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC +GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC +CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA +GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA +GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG +GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT +CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA +AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG +CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC +CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG +GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG +GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT +TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA +ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG +CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA +ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA +GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG +TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC +GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA +GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT +GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT +GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG +TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT +TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC +TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC +GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT +CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC +TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA +GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG +GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT +GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT +ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG +GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG +CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA +CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT +CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC +GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC +TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG +GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC +AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG +GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG +CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG +GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG +ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG +GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA +AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC +CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG +TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA +AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG +GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA +CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG +AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG +CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG +GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT +CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA +AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG +AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC +CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT +GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA +CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG +TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA +CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC +AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC +TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA +CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC +CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA +GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC +GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA +GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC +CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC +TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC +CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC +CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA +CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA +AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT +GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA +CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC +TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA +GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA +GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT +CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC +TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT +CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC +CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG +GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG +GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC +GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG +GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG +TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA +ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG +CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC +AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG +GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT +CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC +GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA +TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC +GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA +GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC +AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC +AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA +CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG +CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG +AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG +GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT +GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC +GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG +CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC +CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG +CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC +GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC +TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC +CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA +CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC +AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG +AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA +GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA +TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT +AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG +GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG +CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT +GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA +GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA +TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG +AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA +GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT +AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC +AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG +GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC +CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG +AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT +TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA +TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT +GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG +TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT +CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG +CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG +TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA +CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG +AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG +GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC +TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA +TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA +GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT +GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC +ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT +TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC +CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG +CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG +GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC +CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT +GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC +GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA +GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA +GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA +GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG +AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT +CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA +GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA +AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC +GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT +ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG +GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC +GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC +GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG +TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA +AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG +GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT +CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC +TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG +ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC +GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA +ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA +CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA +CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA +ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG +CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG +AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC +CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG +AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC +CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG +CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG +CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG +CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC +ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA +AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC +TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC +ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG +CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG +AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT +AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA +TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC +CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA +TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG +CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT +GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG +GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG +CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG +GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG +GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT +AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT +GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT +CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG +GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC +TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT +CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG +ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG +CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG +AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA +CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG +CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC +ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC +GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC +GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG +GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT +TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG +CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA +GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG +CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC +GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG +CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA +CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG +CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA +ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC +CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT +GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA +AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG +ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC +TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA +GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC +GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG +TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC +AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA +ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA +GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC +AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG +TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC +CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT +GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC +CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA +GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT +TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC +ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC +TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG +GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG +TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG +GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC +GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT +ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC +GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC +GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC +CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA +ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG +AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC +TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT +CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG +TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG +CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC +GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT +GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC +CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC +TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG +CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG +AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG +AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG +AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT +GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA +TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC +AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA +AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG +CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC +TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG +GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT +CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG +CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG +GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA +AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA +GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC +TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC +CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA +GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG +CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG +AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG +ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC +ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC +AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC +GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG +GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT +CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC +GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC +CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA +GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA +GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG +GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT +CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA +AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG +CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC +CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG +GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG +GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT +TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA +ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG +CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA +ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA +GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG +TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC +GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA +GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT +GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT +GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG +TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT +TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC +TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC +GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT +CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC +TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA +GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG +GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT +GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT +ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG +GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG +CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA +CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT +CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC +GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC +TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG +GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC +AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG +GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG +CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG +GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG +ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG +GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA +AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC +CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG +TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA +AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG +GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA +CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG +AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG +CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG +GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT +CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA +AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG +AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC +CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT +GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA +CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG +TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA +CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC +AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC +TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA +CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC +CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA +GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC +GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA +GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC +CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC +TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC +CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC +CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA +CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA +AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT +GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA +CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC +TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA +GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA +GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT +CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC +TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT +CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC +CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG +GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG +GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC +GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG +GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG +TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA +ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG +CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC +AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG +GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT +CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC +GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA +TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC +GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA +GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC +AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC +AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA +CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG +CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG +AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG +GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT +GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC +GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG +CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC +CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG +CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC +GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC +TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC +CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA +CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC +AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG +AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA +GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA +TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT +AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG +GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG +CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT +GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA +GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA +TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG +AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA +GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT +AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC +AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG +GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC +CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG +AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT +TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA +TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT +GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG +TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT +CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG +CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG +TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA +CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG +AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG +GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC +TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA +TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA +GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT +GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC +ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT +TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC +CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG +CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG +GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC +CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT +GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC +GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA +GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA +GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA +GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG +AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT +CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA +GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA +AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC +GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT +ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG +GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC +GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC +GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG +TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA +AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG +GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT +CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC +TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG +ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC +GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA +ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA +CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA +CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA +ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG +CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG +AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC +CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG +AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC +CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG +CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG +CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG +CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC +ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA +AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC +TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC +ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG +CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG +AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT +AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA +TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC +CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA +TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG +CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT +GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG +GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG +CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG +GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG +GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT +AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT +GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT +CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG +GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC +TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT +CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG +ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG +CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG +AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA +CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG +CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC +ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC +GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC +GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG +GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT +TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG +CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA +GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG +CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC +GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG +CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA +CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG +CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA +ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC +CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT +GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA +AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG +ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC +TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA +GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC +GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG +TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC +AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA +ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA +GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC +AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG +TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC +CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT +GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC +CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA +GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT +TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC +ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC +TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG +GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG +TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG +GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC +GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT +ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC +GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC +GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC +CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA +ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG +AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC +TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT +CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG +TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG +CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC +GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT +GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC +CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC +TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG +CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG +AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG +AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG +AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT +GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA +TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC +AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA +AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG +CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC +TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG +GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT +CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG +CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG +GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA +AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA +GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC +TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC +CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA +GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG +CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG +AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG +ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC +ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC +AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC +GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG +GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT +CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC +GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC +CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA +GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA +GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG +GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT +CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA +AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG +CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC +CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG +GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG +GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT +TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA +ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG +CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA +ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA +GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG +TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC +GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA +GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT +GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT +GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG +TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT +TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC +TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC +GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT +CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC +TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA +GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG +GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT +GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT +ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG +GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG +CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA +CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT +CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC +GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC +TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG +GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC +AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG +GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG +CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG +GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG +ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG +GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA +AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC +CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG +TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA +AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG +GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA +CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG +AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG +CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG +GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT +CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA +AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG +AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC +CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT +GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA +CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG +TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA +CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC +AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC +TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA +CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC +CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA +GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC +GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA +GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC +CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC +TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC +CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC +CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA +CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA +AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT +GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA +CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC +TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA +GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA +GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT +CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC +TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT +CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC +CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG +GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG +GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC +GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG +GAGGCCGAGGCGGGCGGATC +>TWO IUB ambiguity codes +cttBtatcatatgctaKggNcataaaSatgtaaaDcDRtBggDtctttataattcBgtcg +tactDtDagcctatttSVHtHttKtgtHMaSattgWaHKHttttagacatWatgtRgaaa +NtactMcSMtYtcMgRtacttctWBacgaaatatagScDtttgaagacacatagtVgYgt +cattHWtMMWcStgttaggKtSgaYaaccWStcgBttgcgaMttBYatcWtgacaYcaga +gtaBDtRacttttcWatMttDBcatWtatcttactaBgaYtcttgttttttttYaaScYa +HgtgttNtSatcMtcVaaaStccRcctDaataataStcYtRDSaMtDttgttSagtRRca +tttHatSttMtWgtcgtatSSagactYaaattcaMtWatttaSgYttaRgKaRtccactt +tattRggaMcDaWaWagttttgacatgttctacaaaRaatataataaMttcgDacgaSSt +acaStYRctVaNMtMgtaggcKatcttttattaaaaagVWaHKYagtttttatttaacct +tacgtVtcVaattVMBcttaMtttaStgacttagattWWacVtgWYagWVRctDattBYt +gtttaagaagattattgacVatMaacattVctgtBSgaVtgWWggaKHaatKWcBScSWa +accRVacacaaactaccScattRatatKVtactatatttHttaagtttSKtRtacaaagt +RDttcaaaaWgcacatWaDgtDKacgaacaattacaRNWaatHtttStgttattaaMtgt +tgDcgtMgcatBtgcttcgcgaDWgagctgcgaggggVtaaScNatttacttaatgacag +cccccacatYScaMgtaggtYaNgttctgaMaacNaMRaacaaacaKctacatagYWctg +ttWaaataaaataRattagHacacaagcgKatacBttRttaagtatttccgatctHSaat +actcNttMaagtattMtgRtgaMgcataatHcMtaBSaRattagttgatHtMttaaKagg +YtaaBataSaVatactWtataVWgKgttaaaacagtgcgRatatacatVtHRtVYataSa +KtWaStVcNKHKttactatccctcatgWHatWaRcttactaggatctataDtDHBttata +aaaHgtacVtagaYttYaKcctattcttcttaataNDaaggaaaDYgcggctaaWSctBa +aNtgctggMBaKctaMVKagBaactaWaDaMaccYVtNtaHtVWtKgRtcaaNtYaNacg +gtttNattgVtttctgtBaWgtaattcaagtcaVWtactNggattctttaYtaaagccgc +tcttagHVggaYtgtNcDaVagctctctKgacgtatagYcctRYHDtgBattDaaDgccK +tcHaaStttMcctagtattgcRgWBaVatHaaaataYtgtttagMDMRtaataaggatMt +ttctWgtNtgtgaaaaMaatatRtttMtDgHHtgtcattttcWattRSHcVagaagtacg +ggtaKVattKYagactNaatgtttgKMMgYNtcccgSKttctaStatatNVataYHgtNa +BKRgNacaactgatttcctttaNcgatttctctataScaHtataRagtcRVttacDSDtt +aRtSatacHgtSKacYagttMHtWataggatgactNtatSaNctataVtttRNKtgRacc +tttYtatgttactttttcctttaaacatacaHactMacacggtWataMtBVacRaSaatc +cgtaBVttccagccBcttaRKtgtgcctttttRtgtcagcRttKtaaacKtaaatctcac +aattgcaNtSBaaccgggttattaaBcKatDagttactcttcattVtttHaaggctKKga +tacatcBggScagtVcacattttgaHaDSgHatRMaHWggtatatRgccDttcgtatcga +aacaHtaagttaRatgaVacttagattVKtaaYttaaatcaNatccRttRRaMScNaaaD +gttVHWgtcHaaHgacVaWtgttScactaagSgttatcttagggDtaccagWattWtRtg +ttHWHacgattBtgVcaYatcggttgagKcWtKKcaVtgaYgWctgYggVctgtHgaNcV +taBtWaaYatcDRaaRtSctgaHaYRttagatMatgcatttNattaDttaattgttctaa +ccctcccctagaWBtttHtBccttagaVaatMcBHagaVcWcagBVttcBtaYMccagat +gaaaaHctctaacgttagNWRtcggattNatcRaNHttcagtKttttgWatWttcSaNgg +gaWtactKKMaacatKatacNattgctWtatctaVgagctatgtRaHtYcWcttagccaa +tYttWttaWSSttaHcaaaaagVacVgtaVaRMgattaVcDactttcHHggHRtgNcctt +tYatcatKgctcctctatVcaaaaKaaaagtatatctgMtWtaaaacaStttMtcgactt +taSatcgDataaactaaacaagtaaVctaggaSccaatMVtaaSKNVattttgHccatca +cBVctgcaVatVttRtactgtVcaattHgtaaattaaattttYtatattaaRSgYtgBag +aHSBDgtagcacRHtYcBgtcacttacactaYcgctWtattgSHtSatcataaatataHt +cgtYaaMNgBaatttaRgaMaatatttBtttaaaHHKaatctgatWatYaacttMctctt +ttVctagctDaaagtaVaKaKRtaacBgtatccaaccactHHaagaagaaggaNaaatBW +attccgStaMSaMatBttgcatgRSacgttVVtaaDMtcSgVatWcaSatcttttVatag +ttactttacgatcaccNtaDVgSRcgVcgtgaacgaNtaNatatagtHtMgtHcMtagaa +attBgtataRaaaacaYKgtRccYtatgaagtaataKgtaaMttgaaRVatgcagaKStc +tHNaaatctBBtcttaYaBWHgtVtgacagcaRcataWctcaBcYacYgatDgtDHccta +aagacYRcaggattHaYgtKtaatgcVcaataMYacccatatcacgWDBtgaatcBaata +cKcttRaRtgatgaBDacggtaattaaYtataStgVHDtDctgactcaaatKtacaatgc +gYatBtRaDatHaactgtttatatDttttaaaKVccYcaaccNcBcgHaaVcattHctcg +attaaatBtatgcaaaaatYMctSactHatacgaWacattacMBgHttcgaatVaaaaca +BatatVtctgaaaaWtctRacgBMaatSgRgtgtcgactatcRtattaScctaStagKga +DcWgtYtDDWKRgRtHatRtggtcgaHgggcgtattaMgtcagccaBggWVcWctVaaat +tcgNaatcKWagcNaHtgaaaSaaagctcYctttRVtaaaatNtataaccKtaRgtttaM +tgtKaBtRtNaggaSattHatatWactcagtgtactaKctatttgRYYatKatgtccgtR +tttttatttaatatVgKtttgtatgtNtataRatWYNgtRtHggtaaKaYtKSDcatcKg +taaYatcSRctaVtSMWtVtRWHatttagataDtVggacagVcgKWagBgatBtaaagNc +aRtagcataBggactaacacRctKgttaatcctHgDgttKHHagttgttaatgHBtatHc +DaagtVaBaRccctVgtgDtacRHSctaagagcggWYaBtSaKtHBtaaactYacgNKBa +VYgtaacttagtVttcttaatgtBtatMtMtttaattaatBWccatRtttcatagVgMMt +agctStKctaMactacDNYgKYHgaWcgaHgagattacVgtttgtRaSttaWaVgataat +gtgtYtaStattattMtNgWtgttKaccaatagNYttattcgtatHcWtctaaaNVYKKt +tWtggcDtcgaagtNcagatacgcattaagaccWctgcagcttggNSgaNcHggatgtVt +catNtRaaBNcHVagagaaBtaaSggDaatWaatRccaVgggStctDaacataKttKatt +tggacYtattcSatcttagcaatgaVBMcttDattctYaaRgatgcattttNgVHtKcYR +aatRKctgtaaacRatVSagctgtWacBtKVatctgttttKcgtctaaDcaagtatcSat +aWVgcKKataWaYttcccSaatgaaaacccWgcRctWatNcWtBRttYaattataaNgac +acaatagtttVNtataNaYtaatRaVWKtBatKagtaatataDaNaaaaataMtaagaaS +tccBcaatNgaataWtHaNactgtcDtRcYaaVaaaaaDgtttRatctatgHtgttKtga +aNSgatactttcgagWaaatctKaaDaRttgtggKKagcDgataaattgSaacWaVtaNM +acKtcaDaaatttctRaaVcagNacaScRBatatctRatcctaNatWgRtcDcSaWSgtt +RtKaRtMtKaatgttBHcYaaBtgatSgaSWaScMgatNtctcctatttctYtatMatMt +RRtSaattaMtagaaaaStcgVgRttSVaScagtgDtttatcatcatacRcatatDctta +tcatVRtttataaHtattcYtcaaaatactttgVctagtaaYttagatagtSYacKaaac +gaaKtaaatagataatSatatgaaatSgKtaatVtttatcctgKHaatHattagaaccgt +YaaHactRcggSBNgtgctaaBagBttgtRttaaattYtVRaaaattgtaatVatttctc +ttcatgBcVgtgKgaHaaatattYatagWacNctgaaMcgaattStagWaSgtaaKagtt +ttaagaDgatKcctgtaHtcatggKttVDatcaaggtYcgccagNgtgcVttttagagat +gctaccacggggtNttttaSHaNtatNcctcatSaaVgtactgBHtagcaYggYVKNgta +KBcRttgaWatgaatVtagtcgattYgatgtaatttacDacSctgctaaaStttaWMagD +aaatcaVYctccgggcgaVtaaWtStaKMgDtttcaaMtVgBaatccagNaaatcYRMBg +gttWtaaScKttMWtYataRaDBMaDataatHBcacDaaKDactaMgagttDattaHatH +taYatDtattDcRNStgaatattSDttggtattaaNSYacttcDMgYgBatWtaMagact +VWttctttgYMaYaacRgHWaattgRtaagcattctMKVStatactacHVtatgatcBtV +NataaBttYtSttacKgggWgYDtgaVtYgatDaacattYgatggtRDaVDttNactaSa +MtgNttaacaaSaBStcDctaccacagacgcaHatMataWKYtaYattMcaMtgSttDag +cHacgatcaHttYaKHggagttccgatYcaatgatRaVRcaagatcagtatggScctata +ttaNtagcgacgtgKaaWaactSgagtMYtcttccaKtStaacggMtaagNttattatcg +tctaRcactctctDtaacWYtgaYaSaagaWtNtatttRacatgNaatgttattgWDDcN +aHcctgaaHacSgaataaRaataMHttatMtgaSDSKatatHHaNtacagtccaYatWtc +actaactatKDacSaStcggataHgYatagKtaatKagStaNgtatactatggRHacttg +tattatgtDVagDVaRctacMYattDgtttYgtctatggtKaRSttRccRtaaccttaga +gRatagSaaMaacgcaNtatgaaatcaRaagataatagatactcHaaYKBctccaagaRa +BaStNagataggcgaatgaMtagaatgtcaKttaaatgtaWcaBttaatRcggtgNcaca +aKtttScRtWtgcatagtttWYaagBttDKgcctttatMggNttattBtctagVtacata +aaYttacacaaRttcYtWttgHcaYYtaMgBaBatctNgcDtNttacgacDcgataaSat +YaSttWtcctatKaatgcagHaVaacgctgcatDtgttaSataaaaYSNttatagtaNYt +aDaaaNtggggacttaBggcHgcgtNtaaMcctggtVtaKcgNacNtatVaSWctWtgaW +cggNaBagctctgaYataMgaagatBSttctatacttgtgtKtaattttRagtDtacata +tatatgatNHVgBMtKtaKaNttDHaagatactHaccHtcatttaaagttVaMcNgHata +tKtaNtgYMccttatcaaNagctggacStttcNtggcaVtattactHaSttatgNMVatt +MMDtMactattattgWMSgtHBttStStgatatRaDaagattttctatMtaaaaaggtac +taaVttaSacNaatactgMttgacHaHRttgMacaaaatagttaatatWKRgacDgaRta +tatttattatcYttaWtgtBRtWatgHaaattHataagtVaDtWaVaWtgStcgtMSgaS +RgMKtaaataVacataatgtaSaatttagtcgaaHtaKaatgcacatcggRaggSKctDc +agtcSttcccStYtccRtctctYtcaaKcgagtaMttttcRaYDttgttatctaatcata +NctctgctatcaMatactataggDaHaaSttMtaDtcNatataattctMcStaaBYtaNa +gatgtaatHagagSttgWHVcttatKaYgDctcttggtgttMcRaVgSgggtagacaata +aDtaattSaDaNaHaBctattgNtaccaaRgaVtKNtaaYggHtaKKgHcatctWtctDt +ttctttggSDtNtaStagttataaacaattgcaBaBWggHgcaaaBtYgctaatgaaatW +cDcttHtcMtWWattBHatcatcaaatctKMagtDNatttWaBtHaaaNgMttaaStagt +tctctaatDtcRVaYttgttMtRtgtcaSaaYVgSWDRtaatagctcagDgcWWaaaBaa +RaBctgVgggNgDWStNaNBKcBctaaKtttDcttBaaggBttgaccatgaaaNgttttt +tttatctatgttataccaaDRaaSagtaVtDtcaWatBtacattaWacttaSgtattggD +gKaaatScaattacgWcagKHaaccaYcRcaRttaDttRtttHgaHVggcttBaRgtccc +tDatKaVtKtcRgYtaKttacgtatBtStaagcaattaagaRgBagSaattccSWYttta +ttVaataNctgHgttaaNBgcVYgtRtcccagWNaaaacaDNaBcaaaaRVtcWMgBagM +tttattacgDacttBtactatcattggaaatVccggttRttcatagttVYcatYaSHaHc +ttaaagcNWaHataaaRWtctVtRYtagHtaaaYMataHYtNBctNtKaatattStgaMc +BtRgctaKtgcScSttDgYatcVtggaaKtaagatWccHccgKYctaNNctacaWctttt +gcRtgtVcgaKttcMRHgctaHtVaataaDtatgKDcttatBtDttggNtacttttMtga +acRattaaNagaactcaaaBBVtcDtcgaStaDctgaaaSgttMaDtcgttcaccaaaag +gWtcKcgSMtcDtatgtttStaaBtatagDcatYatWtaaaBacaKgcaDatgRggaaYc +taRtccagattDaWtttggacBaVcHtHtaacDacYgtaatataMagaatgHMatcttat +acgtatttttatattacHactgttataMgStYaattYaccaattgagtcaaattaYtgta +tcatgMcaDcgggtcttDtKgcatgWRtataatatRacacNRBttcHtBgcRttgtgcgt +catacMtttBctatctBaatcattMttMYgattaaVYatgDaatVagtattDacaacDMa +tcMtHcccataagatgBggaccattVWtRtSacatgctcaaggggYtttDtaaNgNtaaB +atggaatgtctRtaBgBtcNYatatNRtagaacMgagSaSDDSaDcctRagtVWSHtVSR +ggaacaBVaccgtttaStagaacaMtactccagtttVctaaRaaHttNcttagcaattta +ttaatRtaaaatctaacDaBttggSagagctacHtaaRWgattcaaBtctRtSHaNtgta +cattVcaHaNaagtataccacaWtaRtaaVKgMYaWgttaKggKMtKcgWatcaDatYtK +SttgtacgaccNctSaattcDcatcttcaaaDKttacHtggttHggRRaRcaWacaMtBW +VHSHgaaMcKattgtaRWttScNattBBatYtaNRgcggaagacHSaattRtttcYgacc +BRccMacccKgatgaacttcgDgHcaaaaaRtatatDtatYVtttttHgSHaSaatagct +NYtaHYaVYttattNtttgaaaYtaKttWtctaNtgagaaaNctNDctaaHgttagDcRt +tatagccBaacgcaRBtRctRtggtaMYYttWtgataatcgaataattattataVaaaaa +ttacNRVYcaaMacNatRttcKatMctgaagactaattataaYgcKcaSYaatMNctcaa +cgtgatttttBacNtgatDccaattattKWWcattttatatatgatBcDtaaaagttgaa +VtaHtaHHtBtataRBgtgDtaataMttRtDgDcttattNtggtctatctaaBcatctaR +atgNacWtaatgaagtcMNaacNgHttatactaWgcNtaStaRgttaaHacccgaYStac +aaaatWggaYaWgaattattcMaactcBKaaaRVNcaNRDcYcgaBctKaacaaaaaSgc +tccYBBHYaVagaatagaaaacagYtctVccaMtcgtttVatcaatttDRtgWctagtac +RttMctgtDctttcKtWttttataaatgVttgBKtgtKWDaWagMtaaagaaattDVtag +gttacatcatttatgtcgMHaVcttaBtVRtcgtaYgBRHatttHgaBcKaYWaatcNSc +tagtaaaaatttacaatcactSWacgtaatgKttWattagttttNaggtctcaagtcact +attcttctaagKggaataMgtttcataagataaaaatagattatDgcBVHWgaBKttDgc +atRHaagcaYcRaattattatgtMatatattgHDtcaDtcaaaHctStattaatHaccga +cNattgatatattttgtgtDtRatagSacaMtcRtcattcccgacacSattgttKaWatt +NHcaacttccgtttSRtgtctgDcgctcaaMagVtBctBMcMcWtgtaacgactctcttR +ggRKSttgYtYatDccagttDgaKccacgVatWcataVaaagaataMgtgataaKYaaat +cHDaacgataYctRtcYatcgcaMgtNttaBttttgatttaRtStgcaacaaaataccVg +aaDgtVgDcStctatatttattaaaaRKDatagaaagaKaaYYcaYSgKStctccSttac +agtcNactttDVttagaaagMHttRaNcSaRaMgBttattggtttaRMggatggcKDgWR +tNaataataWKKacttcKWaaagNaBttaBatMHtccattaacttccccYtcBcYRtaga +ttaagctaaYBDttaNtgaaaccHcaRMtKtaaHMcNBttaNaNcVcgVttWNtDaBatg +ataaVtcWKcttRggWatcattgaRagHgaattNtatttctctattaattaatgaDaaMa +tacgttgggcHaYVaaNaDDttHtcaaHtcVVDgBVagcMacgtgttaaBRNtatRtcag +taagaggtttaagacaVaaggttaWatctccgtVtaDtcDatttccVatgtacNtttccg +tHttatKgScBatgtVgHtYcWagcaKtaMYaaHgtaattaSaHcgcagtWNaatNccNN +YcacgVaagaRacttctcattcccRtgtgtaattagcSttaaStWaMtctNNcSMacatt +ataaactaDgtatWgtagtttaagaaaattgtagtNagtcaataaatttgatMMYactaa +tatcggBWDtVcYttcDHtVttatacYaRgaMaacaStaatcRttttVtagaDtcacWat +ttWtgaaaagaaagNRacDtttStVatBaDNtaactatatcBSMcccaSttccggaMatg +attaaWatKMaBaBatttgataNctgttKtVaagtcagScgaaaDggaWgtgttttKtWt +atttHaatgtagttcactaaKMagttSYBtKtaYgaactcagagRtatagtVtatcaaaW +YagcgNtaDagtacNSaaYDgatBgtcgataacYDtaaactacagWDcYKaagtttatta +gcatcgagttKcatDaattgattatDtcagRtWSKtcgNtMaaaaacaMttKcaWcaaSV +MaaaccagMVtaMaDtMaHaBgaacataBBVtaatVYaNSWcSgNtDNaaKacacBttta +tKtgtttcaaHaMctcagtaacgtcgYtactDcgcctaNgagagcYgatattttaaattt +ccattttacatttDaaRctattttWctttacgtDatYtttcagacgcaaVttagtaaKaa +aRtgVtccataBggacttatttgtttaWNtgttVWtaWNVDaattgtatttBaagcBtaa +BttaaVatcHcaVgacattccNggtcgacKttaaaRtagRtctWagaYggtgMtataatM +tgaaRttattttgWcttNtDRRgMDKacagaaaaggaaaRStcccagtYccVattaNaaK +StNWtgacaVtagaagcttSaaDtcacaacgDYacWDYtgtttKatcVtgcMaDaSKStV +cgtagaaWaKaagtttcHaHgMgMtctataagBtKaaaKKcactggagRRttaagaBaaN +atVVcgRcKSttDaactagtSttSattgttgaaRYatggttVttaataaHttccaagDtg +atNWtaagHtgcYtaactRgcaatgMgtgtRaatRaNaacHKtagactactggaatttcg +ccataacgMctRgatgttaccctaHgtgWaYcactcacYaattcttaBtgacttaaacct +gYgaWatgBttcttVttcgttWttMcNYgtaaaatctYgMgaaattacNgaHgaacDVVM +tttggtHtctaaRgtacagacgHtVtaBMNBgattagcttaRcttacaHcRctgttcaaD +BggttKaacatgKtttYataVaNattccgMcgcgtagtRaVVaattaKaatggttRgaMc +agtatcWBttNtHagctaatctagaaNaaacaYBctatcgcVctBtgcaaagDgttVtga +HtactSNYtaaNccatgtgDacgaVtDcgKaRtacDcttgctaagggcagMDagggtBWR +tttSgccttttttaacgtcHctaVtVDtagatcaNMaVtcVacatHctDWNaataRgcgt +aVHaggtaaaaSgtttMtattDgBtctgatSgtRagagYtctSaKWaataMgattRKtaa +catttYcgtaacacattRWtBtcggtaaatMtaaacBatttctKagtcDtttgcBtKYYB +aKttctVttgttaDtgattttcttccacttgSaaacggaaaNDaattcYNNaWcgaaYat +tttMgcBtcatRtgtaaagatgaWtgaccaYBHgaatagataVVtHtttVgYBtMctaMt +cctgaDcYttgtccaaaRNtacagcMctKaaaggatttacatgtttaaWSaYaKttBtag +DacactagctMtttNaKtctttcNcSattNacttggaacaatDagtattRtgSHaataat +gccVgacccgatactatccctgtRctttgagaSgatcatatcgDcagWaaHSgctYYWta +tHttggttctttatVattatcgactaagtgtagcatVgtgHMtttgtttcgttaKattcM +atttgtttWcaaStNatgtHcaaaDtaagBaKBtRgaBgDtSagtatMtaacYaatYtVc +KatgtgcaacVaaaatactKcRgtaYtgtNgBBNcKtcttaccttKgaRaYcaNKtactt +tgagSBtgtRagaNgcaaaNcacagtVtttHWatgttaNatBgtttaatNgVtctgaata +tcaRtattcttttttttRaaKcRStctcggDgKagattaMaaaKtcaHacttaataataK +taRgDtKVBttttcgtKaggHHcatgttagHggttNctcgtatKKagVagRaaaggaaBt +NatttVKcRttaHctaHtcaaatgtaggHccaBataNaNaggttgcWaatctgatYcaaa +HaatWtaVgaaBttagtaagaKKtaaaKtRHatMaDBtBctagcatWtatttgWttVaaa +ScMNattRactttgtYtttaaaagtaagtMtaMaSttMBtatgaBtttaKtgaatgagYg +tNNacMtcNRacMMHcttWtgtRtctttaacaacattattcYaMagBaacYttMatcttK +cRMtgMNccattaRttNatHaHNaSaaHMacacaVaatacaKaSttHatattMtVatWga +ttttttaYctttKttHgScWaacgHtttcaVaaMgaacagNatcgttaacaaaaagtaca +HBNaattgttKtcttVttaaBtctgctacgBgcWtttcaggacacatMgacatcccagcg +gMgaVKaBattgacttaatgacacacaaaaaatRKaaBctacgtRaDcgtagcVBaacDS +BHaaaaSacatatacagacRNatcttNaaVtaaaataHattagtaaaaSWccgtatWatg +gDttaactattgcccatcttHaSgYataBttBaactattBtcHtgatcaataSttaBtat +KSHYttWggtcYtttBttaataccRgVatStaHaKagaatNtagRMNgtcttYaaSaact +cagDSgagaaYtMttDtMRVgWKWtgMaKtKaDttttgactatacataatcNtatNaHat +tVagacgYgatatatttttgtStWaaatctWaMgagaRttRatacgStgattcttaagaD +taWccaaatRcagcagaaNKagtaaDggcgccBtYtagSBMtactaaataMataBSacRM +gDgattMMgtcHtcaYDtRaDaacggttDaggcMtttatgttaNctaattaVacgaaMMt +aatDccSgtattgaRtWWaccaccgagtactMcgVNgctDctaMScatagcgtcaactat +acRacgHRttgctatttaatgaattataYKttgtaagWgtYttgcHgMtaMattWaWVta +RgcttgYgttBHtYataSccStBtgtagMgtDtggcVaaSBaatagDttgBgtctttctc +attttaNagtHKtaMWcYactVcgcgtatMVtttRacVagDaatcttgctBBcRDgcaac +KttgatSKtYtagBMagaRtcgBattHcBWcaactgatttaatttWDccatttatcgagS +KaWttataHactaHMttaatHtggaHtHagaatgtKtaaRactgtttMatacgatcaagD +gatKaDctataMggtHDtggHacctttRtatcttYattttgacttgaaSaataaatYcgB +aaaaccgNatVBttMacHaKaataagtatKgtcaagactcttaHttcggaattgttDtct +aaccHttttWaaatgaaatataaaWattccYDtKtaaaacggtgaggWVtctattagtga +ctattaagtMgtttaagcatttgSgaaatatccHaaggMaaaattttcWtatKctagDtY +tMcctagagHcactttactatacaaacattaacttaHatcVMYattYgVgtMttaaRtga +aataaDatcaHgtHHatKcDYaatcttMtNcgatYatgSaMaNtcttKcWataScKggta +tcttacgcttWaaagNatgMgHtctttNtaacVtgttcMaaRatccggggactcMtttaY +MtcWRgNctgNccKatcttgYDcMgattNYaRagatHaaHgKctcataRDttacatBatc +cattgDWttatttaWgtcggagaaaaatacaatacSNtgggtttccttacSMaagBatta +caMaNcactMttatgaRBacYcYtcaaaWtagctSaacttWgDMHgaggatgBVgcHaDt +ggaactttggtcNatNgtaKaBcccaNtaagttBaacagtatacDYttcctNgWgcgSMc +acatStctHatgRcNcgtacacaatRttMggaNKKggataaaSaYcMVcMgtaMaHtgat +tYMatYcggtcttcctHtcDccgtgRatcattgcgccgatatMaaYaataaYSggatagc +gcBtNtaaaScaKgttBgagVagttaKagagtatVaactaSacWactSaKatWccaKaaa +atBKgaaKtDMattttgtaaatcRctMatcaaMagMttDgVatggMaaWgttcgaWatga +aatttgRtYtattaWHKcRgctacatKttctaccaaHttRatctaYattaaWatVNccat +NgagtcKttKataStRaatatattcctRWatDctVagttYDgSBaatYgttttgtVaatt +taatagcagMatRaacttBctattgtMagagattaaactaMatVtHtaaatctRgaaaaa +aaatttWacaacaYccYDSaattMatgaccKtaBKWBattgtcaagcHKaagttMMtaat +ttcKcMagNaaKagattggMagaggtaatttYacatcWaaDgatMgKHacMacgcVaaca +DtaDatatYggttBcgtatgWgaSatttgtagaHYRVacaRtctHaaRtatgaactaata +tctSSBgggaaHMWtcaagatKgagtDaSatagttgattVRatNtctMtcSaagaSHaat +aNataataRaaRgattctttaataaagWaRHcYgcatgtWRcttgaaggaMcaataBRaa +ccagStaaacNtttcaatataYtaatatgHaDgcStcWttaacctaRgtYaRtataKtgM +ttttatgactaaaatttacYatcccRWtttHRtattaaatgtttatatttgttYaatMca +RcSVaaDatcgtaYMcatgtagacatgaaattgRtcaaYaaYtRBatKacttataccaNa +aattVaBtctggacaagKaaYaaatatWtMtatcYaaVNtcgHaactBaagKcHgtctac +aatWtaDtSgtaHcataHtactgataNctRgttMtDcDttatHtcgtacatcccaggStt +aBgtcacacWtccNMcNatMVaVgtccDYStatMaccDatggYaRKaaagataRatttHK +tSaaatDgataaacttaHgttgVBtcttVttHgDacgaKatgtatatNYataactctSat +atatattgcHRRYttStggaactHgttttYtttaWtatMcttttctatctDtagVHYgMR +BgtHttcctaatYRttKtaagatggaVRataKDctaMtKBNtMtHNtWtttYcVtattMc +gRaacMcctNSctcatttaaagDcaHtYccSgatgcaatYaaaaDcttcgtaWtaattct +cgttttScttggtaatctttYgtctaactKataHacctMctcttacHtKataacacagcN +RatgKatttttSaaatRYcgDttaMRcgaaattactMtgcgtaagcgttatBtttttaat +taagtNacatHgttcRgacKcBBtVgatKttcgaBaatactDRgtRtgaNacWtcacYtt +aaKcgttctHaKttaNaMgWgWaggtctRgaKgWttSttBtDcNtgtttacaaatYcDRt +gVtgcctattcNtctaaaDMNttttNtggctgagaVctDaacVtWccaagtaacacaNct +gaScattccDHcVBatcgatgtMtaatBgHaatDctMYgagaatgYWKcctaatNaStHa +aaKccgHgcgtYaaYtattgtStgtgcaaRtattaKatattagaWVtcaMtBagttatta +gNaWHcVgcaattttDcMtgtaRHVYtHtctgtaaaaHVtMKacatcgNaatttMatatg +ttgttactagWYtaRacgataKagYNKcattataNaRtgaacKaYgcaaYYacaNccHat +MatDcNgtHttRaWttagaaDcaaaaaatagggtKDtStaDaRtaVtHWKNtgtattVct +SVgRgataDaRaWataBgaagaaKtaataaYgDcaStaNgtaDaaggtattHaRaWMYaY +aWtggttHYgagVtgtgcttttcaaDKcagVcgttagacNaaWtagtaataDttctggtt +VcatcataaagtgKaaaNaMtaBBaattaatWaattgctHaVKaSgDaaVKaHtatatat +HatcatSBagNgHtatcHYMHgttDgtaHtBttWatcgtttaRaattgStKgSKNWKatc +agDtctcagatttctRtYtBatBgHHtKaWtgYBgacVVWaKtacKcDttKMaKaVcggt +gttataagaataaHaatattagtataatMHgttYgaRttagtaRtcaaVatacggtcMcg +agtaaRttacWgactKRYataaaagSattYaWgagatYagKagatgSaagKgttaatMgg +tataatgttWYttatgagaaacctNVataatHcccKtDctcctaatactggctHggaSag +gRtKHaWaattcgSatMatttagaggcYtctaMcgctcataSatatgRagacNaaDagga +VBagaYttKtacNaKgtSYtagttggaWcatcWttaatctatgaVtcgtgtMtatcaYcg +tRccaaYgDctgcMgtgtWgacWtgataacacgcgctBtgttaKtYDtatDcatcagKaV +MctaatcttgVcaaRgcRMtDcgattaHttcaNatgaatMtactacVgtRgatggaWttt +actaaKatgagSaaKggtaNtactVaYtaaKRagaacccacaMtaaMtKtatBcttgtaa +WBtMctaataaVcDaaYtcRHBtcgttNtaaHatttBNgRStVDattBatVtaagttaYa +tVattaagaBcacggtSgtVtatttaRattgatgtaHDKgcaatattKtggcctatgaWD +KRYcggattgRctatNgatacaatMNttctgtcRBYRaaaHctNYattcHtaWcaattct +BtMKtVgYataatMgYtcagcttMDataVtggRtKtgaatgccNcRttcaMtRgattaac +attRcagcctHtWMtgtDRagaKaBtgDttYaaaaKatKgatctVaaYaacWcgcatagB +VtaNtRtYRaggBaaBtgKgttacataagagcatgtRattccacttaccatRaaatgWgD +aMHaYVgVtaSctatcgKaatatattaDgacccYagtgtaYNaaatKcagtBRgagtcca +tgKgaaaccBgaagBtgSttWtacgatWHaYatcgatttRaaNRgcaNaKVacaNtDgat +tgHVaatcDaagcgtatgcNttaDataatcSataaKcaataaHWataBtttatBtcaKtK +tatagttaDgSaYctacaRatNtaWctSaatatttYaKaKtaccWtatcRagacttaYtt +VcKgSDcgagaagatccHtaattctSttatggtKYgtMaHagVaBRatttctgtRgtcta +tgggtaHKgtHacHtSYacgtacacHatacKaaBaVaccaDtatcSaataaHaagagaat +ScagactataaRttagcaaVcaHataKgDacatWccccaagcaBgagWatctaYttgaaa +tctVNcYtttWagHcgcgcDcVaaatgttKcHtNtcaatagtgtNRaactttttcaatgg +WgBcgDtgVgtttctacMtaaataaaRggaaacWaHttaRtNtgctaaRRtVBctYtVta +tDcattDtgaccYatagatYRKatNYKttNgcctagtaWtgaactaMVaacctgaStttc +tgaKVtaaVaRKDttVtVctaDNtataaaDtccccaagtWtcgatcactDgYaBcatcct +MtVtacDaaBtYtMaKNatNtcaNacgDatYcatcgcaRatWBgaacWttKttagYtaat +tcggttgSWttttDWctttacYtatatWtcatDtMgtBttgRtVDggttaacYtacgtac +atgaattgaaWcttMStaDgtatattgaDtcRBcattSgaaVBRgagccaaKtttcDgcg +aSMtatgWattaKttWtgDBMaggBBttBaatWttRtgcNtHcgttttHtKtcWtagHSt +aacagttgatatBtaWSaWggtaataaMttaKacDaatactcBttcaatatHttcBaaSa +aatYggtaRtatNtHcaatcaHtagVtgtattataNggaMtcttHtNagctaaaggtaga +YctMattNaMVNtcKtactBKcaHHcBttaSagaKacataYgctaKaYgttYcgacWVtt +WtSagcaacatcccHaccKtcttaacgaKttcacKtNtacHtatatRtaaatacactaBt +ttgaHaRttggttWtatYagcatYDatcggagagcWBataagRtacctataRKgtBgatg +aDatataSttagBaHtaatNtaDWcWtgtaattacagKttcNtMagtattaNgtctcgtc +ctcttBaHaKcKccgtRcaaYagSattaagtKataDatatatagtcDtaacaWHcaKttD +gaaRcgtgYttgtcatatNtatttttatggccHtgDtYHtWgttatYaacaattcaWtat +NgctcaaaSttRgctaatcaaatNatcgtttaBtNNVtgttataagcaaagattBacgtD +atttNatttaaaDcBgtaSKgacgtagataatttcHMVNttgttBtDtgtaWKaaRMcKM +tHtaVtagataWctccNNaSWtVaHatctcMgggDgtNHtDaDttatatVWttgttattt +aacctttcacaaggaSaDcggttttttatatVtctgVtaacaStDVaKactaMtttaSNa +gtgaaattaNacttSKctattcctctaSagKcaVttaagNaVcttaVaaRNaHaaHttat +gtHttgtgatMccaggtaDcgaccgtWgtWMtttaHcRtattgScctatttKtaaccaag +tYagaHgtWcHaatgccKNRtttagtMYSgaDatctgtgaWDtccMNcgHgcaaacNDaa +aRaStDWtcaaaaHKtaNBctagBtgtattaactaattttVctagaatggcWSatMaccc +ttHttaSgSgtgMRcatRVKtatctgaaaccDNatYgaaVHNgatMgHRtacttaaaRta +tStRtDtatDttYatattHggaBcttHgcgattgaKcKtttcRataMtcgaVttWacatN +catacctRataDDatVaWNcggttgaHtgtMacVtttaBHtgagVttMaataattatgtt +cttagtttgtgcDtSatttgBtcaacHattaaBagVWcgcaSYttMgcttacYKtVtatc +aYaKctgBatgcgggcYcaaaaacgNtctagKBtattatctttKtaVttatagtaYtRag +NtaYataaVtgaatatcHgcaaRataHtacacatgtaNtgtcgYatWMatttgaactacR +ctaWtWtatacaatctBatatgYtaagtatgtgtatSttactVatcttYtaBcKgRaSgg +RaaaaatgcagtaaaWgtaRgcgataatcBaataccgtatttttccatcNHtatWYgatH +SaaaDHttgctgtccHtggggcctaataatttttctatattYWtcattBtgBRcVttaVM +RSgctaatMagtYtttaaaaatBRtcBttcaaVtaacagctccSaaSttKNtHtKYcagc +agaaaccccRtttttaaDcDtaStatccaagcgctHtatcttaDRYgatDHtWcaaaBcW +gKWHttHataagHacgMNKttMKHccaYcatMVaacgttaKgYcaVaaBtacgcaacttt +MctaaHaatgtBatgagaSatgtatgSRgHgWaVWgataaatatttccKagVgataattW +aHNcYggaaatgctHtKtaDtctaaagtMaatVDVactWtSaaWaaMtaHtaSKtcBRaN +cttStggtBttacNagcatagRgtKtgcgaacaacBcgKaatgataagatgaaaattgta +ctgcgggtccHHWHaaNacaBttNKtKtcaaBatatgctaHNgtKcDWgtttatNgVDHg +accaacWctKaaggHttgaRgYaatHcaBacaatgagcaaattactgtaVaaYaDtagat +tgagNKggtggtgKtWKaatacagDRtatRaMRtgattDggtcaaYRtatttNtagaDtc +acaaSDctDtataatcgtactaHttatacaatYaacaaHttHatHtgcgatRRttNgcat +SVtacWWgaaggagtatVMaVaaattScDDKNcaYBYaDatHgtctatBagcaacaagaa +tgagaaRcataaKNaRtBDatcaaacgcattttttaaBtcSgtacaRggatgtMNaattg +gatatWtgagtattaaaVctgcaYMtatgatttttYgaHtgtcttaagWBttHttgtctt +attDtcgtatWtataataSgctaHagcDVcNtaatcaagtaBDaWaDgtttagYctaNcc +DtaKtaHcttaataacccaRKtacaVaatNgcWRaMgaattatgaBaaagattVYaHMDc +aDHtcRcgYtcttaaaWaaaVKgatacRtttRRKYgaatacaWVacVcRtatMacaBtac +tggMataaattttHggNagSctacHgtBagcgtcgtgattNtttgatSaaggMttctttc +ttNtYNagBtaaacaaatttMgaccttacataattgYtcgacBtVMctgStgMDtagtaR +ctHtatgttcatatVRNWataDKatWcgaaaaagttaaaagcacgHNacgtaatctttMR +tgacttttDacctataaacgaaatatgattagaactccSYtaBctttaataacWgaaaYa +tagatgWttcatKtNgatttttcaagHtaYgaaRaDaagtaggagcttatVtagtctttc +attaaaatcgKtattaRttacagVaDatgcatVgattgggtctttHVtagKaaRBtaHta +aggccccaaaaKatggtttaMWgtBtaaacttcactttKHtcgatctccctaYaBacMgt +cttBaBaNgcgaaacaatctagtHccHtKttcRtRVttccVctttcatacYagMVtMcag +aMaaacaataBctgYtaatRaaagattaaccatVRatHtaRagcgcaBcgDttStttttc +VtttaDtKgcaaWaaaaatSccMcVatgtKgtaKgcgatatgtagtSaaaDttatacaaa +catYaRRcVRHctKtcgacKttaaVctaDaatgttMggRcWaacttttHaDaKaDaBctg +taggcgtttaHBccatccattcNHtDaYtaataMttacggctNVaacDattgatatttta +cVttSaattacaaRtataNDgacVtgaacataVRttttaDtcaaacataYDBtttaatBa +DtttYDaDaMccMttNBttatatgagaaMgaNtattHccNataattcaHagtgaaggDga +tgtatatatgYatgaStcataaBStWacgtcccataRMaaDattggttaaattcMKtctM +acaBSactcggaatDDgatDgcWctaacaccgggaVcacWKVacggtaNatatacctMta +tgatagtgcaKagggVaDtgtaacttggagtcKatatcgMcttRaMagcattaBRaStct +YSggaHYtacaactMBaagDcaBDRaaacMYacaHaattagcattaaaHgcgctaaggSc +cKtgaaKtNaBtatDDcKBSaVtgatVYaagVtctSgMctacgttaacWaaattctSgtD +actaaStaaattgcagBBRVctaatatacctNttMcRggctttMttagacRaHcaBaacV +KgaataHttttMgYgattcYaNRgttMgcVaaacaVVcDHaatttgKtMYgtatBtVVct +WgVtatHtacaaHttcacgatagcagtaaNattBatatatttcVgaDagcggttMaagtc +ScHagaaatgcYNggcgtttttMtStggtRatctacttaaatVVtBacttHNttttaRca +aatcacagHgagagtMgatcSWaNRacagDtatactaaDKaSRtgattctccatSaaRtt +aaYctacacNtaRtaactggatgaccYtacactttaattaattgattYgttcagDtNKtt +agDttaaaaaaaBtttaaNaYWKMBaaaacVcBMtatWtgBatatgaacVtattMtYatM +NYDKNcKgDttDaVtaaaatgggatttctgtaaatWtctcWgtVVagtcgRgacttcccc +taDcacagcRcagagtgtWSatgtacatgttaaSttgtaaHcgatgggMagtgaacttat +RtttaVcaccaWaMgtactaatSSaHtcMgaaYtatcgaaggYgggcgtgaNDtgttMNg +aNDMtaattcgVttttaacatgVatgtWVMatatcaKgaaattcaBcctccWcttgaaWH +tWgHtcgNWgaRgctcBgSgaattgcaaHtgattgtgNagtDttHHgBttaaWcaaWagc +aSaHHtaaaVctRaaMagtaDaatHtDMtcVaWMtagSagcttHSattaacaaagtRacM +tRtctgttagcMtcaBatVKtKtKacgagaSNatSactgtatatcBctgagVtYactgta +aattaaaggcYgDHgtaacatSRDatMMccHatKgttaacgactKtgKagtcttcaaHRV +tccttKgtSataatttacaactggatDNgaacttcaRtVaagDcaWatcBctctHYatHa +DaaatttagYatSatccaWtttagaaatVaacBatHcatcgtacaatatcgcNYRcaata +YaRaYtgattVttgaatgaVaactcRcaNStgtgtattMtgaggtNttBaDRcgaaaagc +tNgBcWaWgtSaDcVtgVaatMKBtttcgtttctaaHctaaagYactgMtatBDtcStga +ccgtSDattYaataHctgggaYYttcggttaWaatctggtRagWMaDagtaacBccacta +cgHWMKaatgatWatcctgHcaBaSctVtcMtgtDttacctaVgatYcWaDRaaaaRtag +atcgaMagtggaRaWctctgMgcWttaagKBRtaaDaaWtctgtaagYMttactaHtaat +cttcataacggcacBtSgcgttNHtgtHccatgttttaaagtatcgaKtMttVcataYBB +aKtaMVaVgtattNDSataHcagtWMtaggtaSaaKgttgBtVtttgttatcatKcgHac +acRtctHatNVagSBgatgHtgaRaSgttRcctaacaaattDNttgacctaaYtBgaaaa +tagttattactcttttgatgtNNtVtgtatMgtcttRttcatttgatgacacttcHSaaa +ccaWWDtWagtaRDDVNacVaRatgttBccttaatHtgtaaacStcVNtcacaSRttcYa +gacagaMMttttgMcNttBcgWBtactgVtaRttctccaaYHBtaaagaBattaYacgat +ttacatctgtaaMKaRYtttttactaaVatWgctBtttDVttctggcDaHaggDaagtcg +aWcaagtagtWttHtgKtVataStccaMcWcaagataagatcactctHatgtcYgaKcat +cagatactaagNSStHcctRRNtattgtccttagttagMVgtatagactaactctVcaat +MctgtttgtgttgccttatWgtaBVtttctggMcaaKgDWtcgtaaYStgSactatttHg +atctgKagtagBtVacRaagRtMctatgggcaaaKaaaatacttcHctaRtgtDcttDat +taggaaatttcYHaRaaBttaatggcacKtgctHVcaDcaaaVDaaaVcgMttgtNagcg +taDWgtcgttaatDgKgagcSatatcSHtagtagttggtgtHaWtaHKtatagctgtVga +ttaBVaatgaataagtaatVatSttaHctttKtttgtagttaccttaatcgtagtcctgB +cgactatttVcMacHaaaggaatgDatggKtaHtgStatattaaSagctWcctccRtata +BaDYcgttgcNaagaggatRaaaYtaWgNtSMcaatttactaacatttaaWttHtatBat +tgtcgacaatNgattgcNgtMaaaKaBDattHacttggtRtttaYaacgVactBtaBaKt +gBttatgVttgtVttcaatcWcNctDBaaBgaDHacBttattNtgtDtatttVSaaacag +gatgcRatSgtaSaNtgBatagttcHBgcBBaaattaHgtDattatDaKaatBaaYaaMa +ataaataKtttYtagtBgMatNcatgtttgaNagtgttgtgKaNaSagtttgaSMaYBca +aaacDStagttVacaaaaactaaWttBaagtctgtgcgtMgtaattctcctacctcaNtt +taaccaaaaVtBcacataacaccccBcWMtatVtggaatgaWtcaaWaaaaaaaaWtDta +atatRcctDWtcctaccMtVVatKttaWaaKaaatataaagScHBagaggBaSMtaWaVt +atattactSaaaKNaactatNatccttgaYctattcaaaVgatttYHcRagattttaSat +aggttattcVtaaagaKgtattattKtRttNcggcRgtgtgtWYtaacHgKatKgatYta +cYagDtWcHBDctctgRaYKaYagcactKcacSaRtBttttBHKcMtNtcBatttatttt +tgSatVgaaagaWtcDtagDatatgMacaacRgatatatgtttgtKtNRaatatNatgYc +aHtgHataacKtgagtagtaacYttaNccaaatHcacaacaVDtagtaYtccagcattNt +acKtBtactaaagaBatVtKaaHBctgStgtBgtatgaSNtgDataaccctgtagcaBgt +gatcttaDataStgaMaccaSBBgWagtacKcgattgaDgNNaaaacacagtSatBacKD +gcgtataBKcatacactaSaatYtYcDaactHttcatRtttaatcaattataRtttgtaa +gMcgNttcatcBtYBagtNWNMtSHcattcRctttttRWgaKacKttgggagBcgttcgc +MaWHtaatactgtctctatttataVgtttaBScttttaBMaNaatMacactYtBMggtHa +cMagtaRtctgcatttaHtcaaaatttgagKtgNtactBacaHtcgtatttctMaSRagc +agttaatgtNtaaattgagagWcKtaNttagVtacgatttgaatttcgRtgtWcVatcgt +taaDVctgtttBWgaccagaaagtcSgtVtatagaBccttttcctaaattgHtatcggRa +ttttcaaggcYSKaagWaWtRactaaaacccBatMtttBaatYtaagaactSttcgaaSc +aatagtattgaccaagtgttttctaacatgtttNVaatcaaagagaaaNattaaRtttta +VaaaccgcaggNMtatattVctcaagaggaacgBgtttaacaagttcKcYaatatactaa +ccBaaaSggttcNtattctagttRtBacgScVctcaatttaatYtaaaaaaatgSaatga +tagaMBRatgRcMcgttgaWHtcaVYgaatYtaatctttYttatRaWtctgBtDcgatNa +tcKaBaDgatgtaNatWKctccgatattaacattNaaacDatgBgttctgtDtaaaMggt +gaBaSHataacgccSctaBtttaRBtcNHcDatcDcctagagtcRtaBgWttDRVHagat +tYatgtatcWtaHtttYcattWtaaagtctNgtStggRNcgcggagSSaaagaaaatYcH +DtcgctttaatgYcKBVSgtattRaYBaDaaatBgtatgaHtaaRaRgcaSWNtagatHa +acttNctBtcaccatctMcatattccaSatttgcgaDagDgtatYtaaaVDtaagtttWV +aagtagYatRttaagDcNgacKBcScagHtattatcDaDactaaaaaYgHttBcgaDttg +gataaaKSRcBMaBcgaBSttcWtgNBatRaccgattcatttataacggHVtaattcaca +agagVttaaRaatVVRKcgWtVgacctgDgYaaHaWtctttcacMagggatVgactagMa +aataKaaNWagKatagNaaWtaaaatttgaattttatttgctaaVgaHatBatcaaBWcB +gttcMatcgBaaNgttcgSNaggSaRtttgHtRtattaNttcDcatSaVttttcgaaaaa +ttgHatctaRaggSaNatMDaaatDcacgattttagaHgHaWtYgattaatHNSttatMS +gggNtcKtYatRggtttgtMWVtttaYtagcagBagHaYagttatatggtBacYcattaR +SataBatMtttaaatctHcaaaSaaaagttNSaaWcWRccRtKaagtBWtcaaattSttM +tattggaaaccttaacgttBtWatttatatWcDaatagattcctScacctaagggRaaYt +aNaatgVtBcttaaBaacaMVaaattatStYgRcctgtactatcMcVKatttcgSgatRH +MaaaHtagtaaHtVgcaaataatatcgKKtgccaatBNgaaWcVttgagttaKatagttc +aggKDatDtattgaKaVcaKtaataDataataHSaHcattagttaatRVYcNaHtaRcaa +ggtNHcgtcaaccaBaaagYtHWaaaRcKgaYaaDttgcWYtataRgaatatgtYtgcKt +aNttWacatYHctRaDtYtattcBttttatcSataYaYgttWaRagcacHMgtttHtYtt +YaatcggtatStttcgtRSattaaDaKMaatatactaNBaWgctacacYtgaYVgtgHta +aaRaaRgHtagtWattataaaSDaaWtgMattatcgaaaagtaYRSaWtSgNtBgagcRY +aMDtactaacttaWgtatctagacaagNtattHggataatYttYatcataDcgHgttBtt +ctttVttgccgaaWtaaaacgKgtatctaaaaaNtccDtaDatBMaMggaatNKtatBaa +atVtccRaHtaSacataHattgtttKVYattcataVaattWtcgtgMttcttKtgtctaa +cVtatctatatBRataactcgKatStatattcatHHRttKtccaacgtgggtgRgtgaMt +attattggctatcgtgacMtRcBDtcttgtactaatRHttttaagatcgVMDStattatY +BtttDttgtBtNttgRcMtYtgBacHaWaBaatDKctaagtgaaactaatgRaaKgatcc +aagNaaaatattaggWNtaagtatacttttKcgtcggSYtcttgRctataYcttatataa +agtatattaatttataVaacacaDHatctatttttKYVatHRactttaBHccaWagtact +BtcacgaVgcgttRtttttttSVgtSagtBaaattctgaHgactcttgMcattttagVta +agaattHctHtcaDaaNtaacRggWatagttcgtSttgaDatcNgNagctagDgatcNtt +KgttgtaDtctttRaaYStRatDtgMggactSttaDtagSaVtBDttgtDgccatcacaM +attaaaMtNacaVcgSWcVaaDatcaHaatgaattaMtatccVtctBtaattgtWattat +BRcWcaatgNNtactWYtDaKttaaatcactcagtRaaRgatggtKgcgccaaHgaggat +StattYcaNMtcaBttacttatgagDaNtaMgaaWtgtttcttctaHtMNgttatctaWW +atMtBtaaatagDVatgtBYtatcggcttaagacMRtaHScgatatYgRDtcattatSDa +HggaaataNgaWSRRaaaBaatagBattaDctttgHWNttacaataaaaaaatacggttt +gHgVtaHtWMttNtBtctagtMcgKMgHgYtataHaNagWtcaacYattaataYRgtaWK +gaBctataaccgatttaHaNBRaRaMtccggtNgacMtctcatttgcaattcWgMactta +caaDaaNtactWatVtttagccttMaatcagVaagtctVaaDaBtattaattaYtNaYtg +gattaKtaKctYaMtattYgatattataatKtVgDcttatatNBtcgttgtStttttMag +aggttaHYSttcKgtcKtDNtataagttataagSgttatDtRttattgttttSNggRtca +aKMNatgaatattgtBWtaMacctgggYgaSgaagYataagattacgagaatBtggtRcV +HtgYggaDgaYaKagWagctatagacgaaHgtWaNgacttHRatVaWacKYtgRVNgVcS +gRWctacatcKSactctgWYtBggtataagcttNRttVtgRcaWaaatDMatYattaact +ttcgaagRatSctgccttgcRKaccHtttSNVagtagHagBagttagaccaRtataBcca +taatSHatRtcHagacBWatagcaMtacaRtgtgaaBatctKRtScttccaNaatcNgta +atatWtcaMgactctBtWtaaNactHaaaaRctcgcatggctMcaaNtcagaaaaacaca +gtggggWttRttagtaagaVctVMtcgaatcttcMaaaHcaHBttcgattatgtcaDagc +YRtBtYcgacMgtDcagcgaNgttaataatagcagKYYtcgtaBtYctMaRtaRtDagaa +aacacatgYaBttgattattcgaaNttBctSataaMataWRgaHtttccgtDgaYtatgg +tDgHKgMtatttVtMtVagttaRatMattRagataaccctKctMtSttgaHagtcStcta +tttccSagatgttccacgaggYNttHRacgattcDatatDcataaaatBBttatcgaHtN +HaaatatDNaggctgaNcaaggagttBttMgRagVatBcRtaWgatgBtSgaKtcgHttt +gaatcaaDaHttcSBgHcagtVaaSttDcagccgttNBtgttHagYtattctttRWaaVt +SttcatatKaaRaaaNacaVtVctMtSDtDtRHRcgtaatgctcttaaatSacacaatcg +HattcaWcttaaaatHaaatcNctWttaNMcMtaKctVtcctaagYgatgatcYaaaRac +tctaRDaYagtaacgtDgaggaaatctcaaacatcaScttcKttNtaccatNtaNataca +tttHaaDHgcaDatMWaaBttcRggctMaagctVYcacgatcaDttatYtaatcKatWat +caatVYtNagatttgattgaYttttYgacttVtcKaRagaaaHVgDtaMatKYagagttN +atWttaccNtYtcDWgSatgaRgtMatgKtcgacaagWtacttaagtcgKtgatccttNc +ttatagMatHVggtagcgHctatagccctYttggtaattKNaacgaaYatatVctaataM +aaaYtgVtcKaYtaataacagaatHcacVagatYWHttagaaSMaatWtYtgtaaagNaa +acaVgaWtcacNWgataNttcaSagctMDaRttgNactaccgataMaaatgtttattDtc +aagacgctDHYYatggttcaagccNctccttcMctttagacBtaaWtaWVHggaaaaNat +ttaDtDtgctaaHHtMtatNtMtagtcatttgcaaaRatacagRHtatDNtgtDgaatVg +tVNtcaaatYBMaaaagcaKgtgatgatMgWWMaHttttMgMagatDtataaattaacca +actMtacataaattgRataatacgBtKtaataattRgtatDagDtcRDacctatRcagag +cSHatNtcaScNtttggacNtaaggaccgtgKNttgttNcttgaaRgYgRtNtcagttBc +ttttcHtKtgcttYaaNgYagtaaatgaatggWaMattBHtatctatSgtcYtgcHtaat +tHgaaMtHcagaaSatggtatgccaHBtYtcNattWtgtNgctttaggtttgtWatNtgH +tgcDttactttttttgcNtactKtWRaVcttcatagtgSNKaNccgaataaBttataata +YtSagctttaaatSttggctaaKSaatRccgWHgagDttaaatcatgagMtcgagtVtaD +ggaBtatttgDacataaacgtagYRagBWtgDStKDgatgaagttcattatttaKWcata +aatWRgatataRgttRacaaNKttNtKagaaYaStaactScattattaacgatttaaatg +DtaattagatHgaYataaactatggggatVHtgccgtNgatNYcaStRtagaccacWcaM +tatRagHgVactYtWHtcttcatgatWgagaKggagtatgaWtDtVtNaNtcgYYgtaaa +ctttaDtBactagtaDctatagtaatatttatatataacgHaaaRagKattSagttYtSt +atatatagtcttaaaaMtcatgttcaaDactgRttctaagagDtatttttagcgacttgt +gRtgNctgSgRaaaaatgcaMtYtDcatcaaYKttHcatSWgaaaatDataggttatgBD +MtgttataacaaYSgagttacgttatgtDStttaaatctcgWKtcSacgagagaSgttat +BMDgtcggtgtgcgaNtaSHBatBtttVMgVcagaNatcaDDaKMtMYtatagaBccctc +tDtgtatttatatKNtgggtatgtRaacttgaWaaYgcaHatccctggtttStatMtcgc +MtaaaWKttMVtWctVtgttaKDWctgWaVttaDVatgKtagagtcatctaKWgtaaMtt +SacBaMattaKaaHDataattgWtgttttgtcatBacacgtStacaaagtNctNtgtgat +cHtWttcKaagagttttaaaaWacgRacatctNatVStgaatDHgttWcgtRKcatatat +ctcaNttaaBDcctgaaaaaDtaYaHaKttNtaYVaVtttaDtctacttctWttaactaa +ttttMagWcaatcccNKYtBaacatgttgaKgKcgcBHaatDMttatatcSWacatDatR +cWaMtDgatBctHgScttaaaHtSgKtDtttattgtRStWgttccatatttcacWttcat +attgtaHVgaBtacaMtgMaaagDaataactDatattagMaNBagcttcattcgtaaKtg +tatttcacMtgBaVtaattStcttagtYgtgtcgccttKatgggtgaWaataggaatacM +MagaSKRttBgatgacRtgMtagaSRataggtatcaccgaNaaaWSWacDgatacttgat +tagcttgtgVMttatYctaRgHVcDtVRRtSaMtcaVtVtatcaYaHatattaaVaatct +aBtgtacRatNtatttgaYatSaHctaNgNtYtYaYagattVgatcRtaacgYggtgtat +KttaatMagatgRtatatgHaKccHaaaaYtgaacgaWaNgtYHgacagaYtctaVtacc +cgatttttaaagcDttatNRgattKaaattttcatctaatgccgcaataataattgttat +YtagtRNtaagttggtHaKttWMtDKgatSagBYcgRggtWaVaattHtatgtaaaMgSa +aagataaKaaKgttDttttRaagaacaWRcaacDgtgttaatattaKtatcaWacacatt +tVtctgatHRcagtttNcaaatcNctNttttataactWacBBttgBttaaaRaWtBKaaa +cgtatcRcaMaatgYacaaaagtgBataStWYtggtatgacaKWtctSgcKHgtcNaMNc +ataSatattgactacMcataattNVtDaRccaaatcagttttYttagYaacgtaatMtMV +atNgKaaMaaBgattaKttatDaBcttKtccttttacDagaYtacHgttggacaaaVaat +agtYatcataSgatcaaWVttcgaatgaccctccttNtaSBWaatttDttttcaatatYg +gctatDcttatNctttagDcMttcaacWaaNattSYgctttcaHcRaattaataaaatcV +ccRaattactctaMaVRattacagtgRcDtcgtgctcttNtWVtacagtHtatHaBDtcW +ggtgctcaaRHtatgtDgacStgcaaaVKtagttataatactaatatgtagScaatRSac +aattgtattgcagatHHtgBcaatKKtaaMMcaRcgactatKBaMaYatgKatttDaaNt +RatattgtatWttagcaaaaacaWgcacaaHcataYtDaHgttataaSacgcagggggtY +atgcKctaaaHgcVgctBDaVttccStagNgcSgtatgVYaMatcaWRBtVtgYttgtgR +cYttcgctgaacNttgtgtctattWttttcctagMtagaWtaKgatStScatMaBtaSta +SactattYNatctgtacRatYDaatgatgatatgaatYaaaaSHttaaYMaWtDcaNHaB +caYtgVgcatVaacattMRatBtaatttaDacRtagtaaaNYVSMtcagaaDtttDHtRc +YatacSNKaaMcHgatBaaVttactggBYgaYatttttgcDacHctWatcgtagagtact +cattDggtcatKaSgctttatttagtDtRBacttaWYaaaattttgaccttaaWtaatgc +RgccacttMtaggKtcBtgacgaHctttatcgtcStatMHDNagattatNagVaaaWcgg +aaaYcaVactDYactaStattgBHtcYctgggtacatataaYcgaYagaggaggacaVat +acHRtYtctgtaVgaYcNgaaaNatacVgcNgtaatttDcatttttcaacttSNcaaDat +VYctSgcaccttagMgacgcttgaSttaaaatagttaggRHttaaacMatagcaWgMgag +tcgctagtgtKgactaaHttattaWgcaaaaaaSatatgcgttaBNggttaYVatgaact +ttttgccatataaataRatSaBctagttataBccgaaacaagatacttaattttgaHgHM +gtaaKctttaYtaaRacBMtBaYgaBaaacaYtVtagcRgWatHaWagattWSacStMHa +tttaDagacaatcgtgtKtttggaMtgtWtgtgcaaNaaaaWtKaaBcMWtcttctatga +cVgagcgaggHaYYtttWgSaaYYaWtRYHHaMDtctttacaatggaaMctataagcttB +cgHcNWaatttgtatatYtStatctagcactgtVttccagaaattaDtttaRtVataBtt +WagcatDMVactYtgcatWtttgaaMggKaatgaaaaHtataDtgYcMggVaaatSMHtt +tgVttaYaWaataRttgttaYttattttRtWtataaBgtDtttatatcVgaaBcaDtatg +tcaDagaWtgaYtWctcVagctcagctatatagcRVtcaKtaataatHgNaccgaaaatV +HBaatattcgttaVYttatttctBYaatKaagaccVStttcattgaMagSaaaaccccWK +caaNtMYacctaDStagaaatttatcatVgtcaatacccKattgtaaagtggWgtatatV +tagBcttDaBacaattWtDYKtatRKggStRtaaaWatBtaagtaattDaaaaBRacWta +agtacaSttaaatccgctaaccKaattgVWttDattatttattKaMtcYtMRWagMtcgK +gBagacgggVaaNaaatgctKcgtaataaKtaaagtccWcttHMatSYgataaatDttBa +HccattgBttSgaaHYtaataaaMtgaagatgtttBgRcattaRaDHcttBgaMaWaaVM +MattaatttgtgBRctattgKMagNcMtatttaaaWttgaaacatWgcScgYYDYgttYt +VtattgcKcWtagcggtgBaSctaKatacaaVtcaRDccccgtgttBgKgggtHagcgaa +ttaaagMMttScggtDttttaHcSaagaacactcacactBcVgaKNaDHacacttatSag +aattSKHtcagtataaatKaaHtgaaRagaaVcBtaHtaaatcgatcWcaRtaaaattta +WttaagtcaggRctgaWcttDttgactttaVSaaaatggtaWDaRMtBtaaaaaKatBga +tMtctatatcaVaMgatttgNagtDRttDatcttttaMtYaaatcggagttctctaYatN +tagaNcgMMactacHcaagtaaaatStaSaacaHcacSgggtNKatggaaagcggaaKgg +gtaYtacSgccgBaggcRacgtVgDtggaMcYaaaMatggacgYStKKatgaBcaaRtSt +ccSagcRccgccgcSDtgcggBDgaDtBtSSggacMttttaWcatcMatgtNMBWgataa +tcaaVtgaataataaNatgcaaNttNctgacDMcaHccgatgKgWVttccaStggattct +cDacttttttctttaaNcWaMWccWKWttgaaaMctDaaBactRtVattttBtcMaNttW +cKacagttKSttaYaWSactHSaBtHgatgttacatgcatatMtttgtaacScWHBatHa +ctggatatatctgagMgRSatctaaSttaVagcaRcttggaYaatKHtagBBactattcg +taaagaagttgtVcgatgaVatHMtcaggtcgKSgWattgaaaVctccVgtDcaaatgaa +HgMYactcaMatatatattNVttWtWaatttacRagKataaaNtttacaaWgMVactatt +aSgaggVaaagVtaccDRHaaataRaHaRgcattMttcaatcaKaaataDcaDKtctcga +ggBggacctDtttatHacWVaWgatDctaNaNcgKatcMtcMaatBtttggacgtgataa +tagaaacRactcBtattttaKtgSaaggKtaggRaVtatagcccaNRttaccttSMaaga +tcggDacNBatWcgaactacactaactNBtaStgVtNagcatctaVtaKatKgaBtcgtt +tWaagWMgagRaNatHaaaaDtacagacaBagtgcaHaNatctcBccNttaagttDgaat +aaNtcgctaacRBgtaatSttaatatgcataacccaSattKcccttDttggtcaatgggt +tWaacgatacattBtgMaYgaRttatgatKaKgtattDtKWgataacgNBtaccgaKWat +cttcttKtgtcttagcattcctWcaaHgagtatDMSgKtcagcttgVHaKcttDaataaa +VaatttDgtgaaataaRgtcaVaatacttagtVatatgggcatgtDDtMtgtatBggatt +HtgcVtgtgatcaaSattatKYVaacSNNttNWcgaHttKDaaMYHatcgttaattaStt +gctWaacHtaKBtaaaaKHttcRWgaaWcRtBtttggBcDtgtacNttaagcKtaHgtag +aaaaRttgaaacatagtWRaacYggtaaatcgctYaBtWDRtgttgSctaaKatNcattg +tgtMttatccatatagctSacgccSNaaactacgNtgtgcttMatSKtcaaBaNaaacat +aacagaaatagtagctcNcatcVgaagStaataVcDKKttcagDHDtattctaatgaggg +RgBMctatacaagYactctMaaagtcgctttctcgtgaattatNcgatMtttaggcBaaa +tctNtactaaRKtgKactattgtcatatgtacgagttMaaHSSgHgBatatcgcaSaata +aaWgaagtatagaHgcttctttatgaccWaatttaRtaDaatttaatcgaaattgattMc +atcaWaMtaWaKactttctBacactatNgtccttaWgtctgaccKatStaKtgagtacgg +gcgcgtYNtatttagacctctKcatgatKWStcaataactaWgMSgHtgatctttttgtc +gacgtSacttaYgcctWctcctctacaagVtttMaBactWVaccaYtgtSgcgttattcK +tatStgaaKaccgNaataaHtatWtYtRacggcaDaScagcagHaYWRtRNcDtHtcVWt +ggaataaaYttgVaNtgttagtYttgtagSaaatDgaggccDcgBRYStattatttaagg +ccgHgggYRaaccMaagttatSttctttagcMtgcgMtgaSagaNaDagttSatgattWa +tttagtDgcttgagtgMKaYWaYccagcaHatKctaKaDgctagacttattgattaaYtt +atcttattattStaattWaRaYBWagYaatatgttRgScttgBagDaWgcgtgcVDaggc +ttgtctaDRKacttgcaKBWRtaaVaSctKtacttMaaSVaWWcgSaNtttSWgtcggtc +acttggVVtgagaataaataaDttgaaccaaaaMttaaaagaaaaaaaatcNBtatMgcc +WagcaNgaVaNaaaaaaYaMgttaWtatHaagtNtacgacaBtMMattttWNaRtaaata +gYaScKattacagctVKBtWNSKgYtYgtWatHaVatDaaatWgDatcctggSRagagta +aaaMgatttRtaHacatggtaKagVcctgatgaMtaaYgatgtattattttHggBaccaD +ctctggNNtYaatctVttgVtRtVcRacttNctttataggHSRtaRacaaattaacHaHg +tgttgtttcBtBtatWtgtattttgcKagMcaaagaMtattagtStagcBacYaaHcagV +gWtgtttcgtgDHaVtagDatcRaRtggtWtaactgcacgaggaaaRttSDaaVaSttaa +aaacSMttactaNtcaacaattDtacttttYatVSacYtWtMttaattatcKtcttctat +caKDtctStSaaacggtYccatgtgagagtWtagWKgcaBaaaaKttgNactaatcgagg +cWtcDDaaaaaacactHattaattcactatYttaagacactaKaagRtRataaattttca +tHggtaataaatgataHtggctaacBacDgtaatattRtYgtDNDBgKtcaggcHatttt +gHNgWtaatttccgactactgacatVNttYYgactcgctctatttagaMcgggatHcgtt +tatBaDSagBaaaagRttBggttaaBactVHgatgaatttattcaaaattgcacttcDga +cttYcVttactVtttatBaKHagaWgtgaatggBtaaSggcagacNcttaDttVgMtWag +attggVatttacHtctNcMatacttSatMagcttgtNcYaaScaYactcKctKtagScSt +cagtttcatWaatggtgagaggHaggggcaacgcRKtaRcMaNtHaatRaRaaactVtBt +gttaatRtWWcaaagKttccaaKaaatacgVttcacaaacgcggtgagaRaatggtgDMW +atcWVScacaaaDaggaaHtgttSMaaaaaccYccDBtatYgtMagcSagaccaVcctcg +gtVWaaagttatcNaagataataSaataaaKccgtaDtYttatYcttHttaagKcMctaa +atggaatRgaaaVaaVtcKYaggatWcaBtDaggDatccttcYNtgcSMRgaRtNgaatc +gttRttatDVMtagctttacatDVtatatatcagctaDagMtataccYgaggYaaatgDa +aaatSgctctgatgtttVaaBcctgataKtagaaaccaKatatgttaDtgaDtatagata +atacagtaDtatcNtgtDMtYcattRVtctataNtWttggNaSgtMgaaYctctDggHtg +gHDccaccacKKaaacaaaatRatttccctttaagcRattMHctattHaRtataVattgg +atcSttaaHaHgaaHNDtacattSaaggDatttcaaaYgctBcatattaaaKagtgccca +tSctcgatRtaaaMtgWactttNMaWctYgRatDggaactcDcaattaKaactgagtatc +tataagYaaaSRctggtacWtttccWtaYRtKHattatagWtKttaNgcDtatHacccat +taatttataacgctMgaagtaacaacagMgtaYHYVtKMHtacMgKcaaatctgRYataN +tcgttcaatacggWtMcaatYcBWaagYtVaDNagtatagDaaNtaaaYtttcYWttttS +tgggataaMgatattagaaYtNctcttcBagactaYDcgtacHDWccKaHgttcttHgVg +gVDttatcatKaMttttacWaaSattctatagaHaggKaDagBtaaagtcYccattgtYc +atctaNgRgVtgaagtDKttatBKcggDtattRYgHccgtgcgBNMtttVRgacaYctSc +taRacgtagagccgtacRaagtaHKagStSttttgYSatattaaaWHaaWagttDKaaNa +NHaaHttaYcttMtcaaatgKttBtSgtccaaVaattSaacgttgNattgatatNctaWt +VcagtactKcWacgVagggHaaRgaDaatcMttattaataacaBMaaVtgYtKgRgHact +gtactatcBaMtVggtagKcYtHtBSaattagtaatgMcaVVagYYgWtactttccaaSt +tDgaaMaMttcacttYtRgacttcagcttWtttagtgataMaattaagVtagaatatKat +aagtagttaagHMRaDattaHaaVcctDtagtcVYcaataaYcNttNaaaHctcaRaatt +tcaNRgatSHgVatagctRtcatgaBttMaaagRtcgHVtgRgStgatttgtagaKagaR +WRctgNaHYgaaatBctgtttRttNWagaccgagKgtgcggHKVttaatattaatataat +aDtaNcctacaaRgcaNMctctgaaSHWWHcttagtNagtWgWaaKtYaNgcBattatcc +aaaSctRRHKaNtKcBgtgagaDRWBttactaaattSMctatatagaaYacDgatttccV +taagRtgRataatatagtctttttatgtMgtcaacaaNtaaaaactctWtagaVaaaDta +attatagtBStcgaatDtgattVaatMtcaDattVKWaagatagggttgtMRSgtcYgWM +aatgNtagtcBttagtttctctWaaMtVgctWgSgtHagaSagactagKtagWggcattt +HgttgacaaactcggggHggcWBgVgtatgggagVgagtcVcBtDctttagtctaagVWt +HtgtttaScatacMBtKgattatRtgtttgtctttDggcHaBtRtgtaataNataattta +taWctgaYWataStcHaatcRtaaVagDWaSatagtaccNDgaagtatacgttttacgac +gKRtattgDctatRRattVtStaaactagatgVatttagaMaSaaaattVtatYtgttgt +RMagtHaatttSttaaYNaggWagtgcacgaMcactgHgtgtgggHMgtKacttaaYgtc +gcatcSatattgBaagtttacMtYagSatttatttaVtaaDtaWaHcgNatactgactHt +ggWtataDcDScatactcStcDtgtcgtgtatgaggtHaaNKgDattgcBccaagKgtat +gacKSMtttttgttcaaatcaaYtagtaSatgDaaaMccKNaMaatagaataagcaatta +ttataaMgagtgaSgtctNYttattHaNaYYtcDDtaatNRgtatttaaYtaaatcactH +VaHcStccttcccaaVatcVggatKtatgRaaDBgaYtttacttYggactSDtaBcaaNg +gggtattatattBDcttagagYNMatBgttYaagactMatgttRgatacccgtaacacBH +tatKacWgatRcHttaattYtKtStccaaatVDcaNKHHaaataatagtagtatcttgct +NDggVaVVtaVaRaaagSaccgttctcMtVtgNBgtDtttctYgttactBctcRtStWtW +DScMtcWSaRatgaataRHctaNtcStctYtWacagatgtatYBtHaHWBtacggtDcaa +BtatcaggtcaVattaNctactgaaaatWaDgactNWtMtggagaattBaataYcMWYcg +atMYatWtgattSatgaRtDaRgccagtSttatatRaBtattRcWtagtVgaagttMcta +ttatatDttaggtctKtgtgtBagacgttatRKtgatctatttBtataactgataacKcg +gagtgHgtVttcttgtKDgcDtaYatBDatcaatattgttNtaBacatcgcNcaKcaWcR +ataWcVgtacgScaWgttcggHcMttcRccatgaRStYgNacagatacYacWWtggNaDc +WagttHatMaNaatNtcDMDcMaKgHNatScVgatKWatatgNRgtccgYgaagattDHg +tMtcHaSNaaattBatRagtaaatttacaagHWtKatcaagtccHtYcctgttKDMSgta +ctactVctgacaaaaHgatatacataatKtStHgctScSatNatacaYttaaWHtctgaa +tYtagtHtKaggccWBaStaDctaagagNtaatcaatcgttNgaYDaagtaaaaHataga +atcgcgBaYaBgaacSaaWaaaaactccgcMttHttYgtaagaMctKBtacSagattcBa +aWtaattttacRttatcgaRtacaRHgtgRagaaBcttaVgacVDgggaatVatagaact +RRtacgYttNattVHgaHttacaaaaaaaYtcRWtgtgattatgccaSDtttatKWgaat +atSNDgattttaacgtcSRtatggttcttcBtWtttMtBtMScttaHatBattHacYtaY +acattcgttKgtcStSctcKtatatttcaKSgagcttccaacaccRDtttDaccattata +tSgtcWtVaaagttgtagccattDtYaatattDaccatcVDaaRccagttttgtcHacMa +ttcHgaNcatgttKcVttcctgtgcSataaatattgaKtctaWctMRaKggtaYcaagtt +DttcgttacRtatgatggHNaWMtKttcatattaaDaSaBaaaMtMatBgKtttgHtHac +taatcatcgtWaatKaaWcaWtcctVttaaNaggaaaagtaaagaDctNttaDBaBgata +gMgaataacRcYggatcRaaaHaagatRDtVRactaYagttcaccaaWtctcSSaaatcS +KattctggDgaacagDtaDagacagtgtaattcaStYttNaStgtaHgccttaScatMRc +accWtcatttatRtaagatWtNataaWtMNtDVgWttgcWgtgaRttttRgWcttMtcta +HacaaYtKctgaBagtRagacttDatNttaaaDgRtatNcHatcSDgtBatcttacVcYa +cNgaattaacgagttgYgacttDattatacBattMgctagcctagatVcaactNttccta +atgtDaacgYaNatagMatSWtYBaaaRtgMtatSRgaataYaScaVgtaScMagatNNt +ttacaaHBaWtNtRtctaaacDaaaaWMcaNtcVaDNcagaDtgcWKYgagttaHtgcDY +ataaacataBaWWtcggtatgtgaaScaacctttRNatcgttaaagcaDctaatgcBatt +tacaattVaMgSMMtccYaaaBYtggattttcataWttgBtatDtBgactaatgtccWaa +HataaScHttWttDtcgtcaagMctMDtaaaatRtBaaaacaatgtcagcatBgNNBVtt +ttttcBacWtttWtSWWtgaaaaSacgBtaaataaagtcDStaagaactgttaatYatgD +ctattactgaHtaaatStHaagacaKtagDtaaHaDgttccaaDtaaggacactctDggc +gtDagtcWaHgRcHgDgaSctttattgtcttttccttRYaDgNactaaatcaWggcNSBa +gttttatatStKgtcRtgattaaggtcaSBttaacaaKatgggatcaaattgRgcBagtN +tcgDcatttWcctttgtNagDgctgcatttactttgtgtcaBgSatttNHaMcggcagSc +tcKDtWBaagSagWatggYtVatSRgKagattgaVatKttcgatYatKYSgDaacNtcVg +tttaWataWtgVctgcgSggMgatccatgagttgtWcatYWWcctVcNHagtNtgtKttt +gatcaacttaSttattgatNcatWaVgNHcagStVHcggHacaaDttgDttWcaaRaKga +aatKaattagtaWacattgaaatgtgaatgacagtgaRVtaaYagYtcggcatMttgaag +gDgagDRcaKgHtacacaaaMcaBtagHactgKaatRtNttcttcatcatNgYgStggac +tatgSMttgKtDaDgacRRgtWaVattgatttaagYctatatagactaagaggtatWtat +aaactaYaHRctStgKWcgtRtKtYtYtagacgattRaaYBtaStcttaWataatcHtta +taRcactgagtgggagccaattctcDtgDaggHcDRVaVVggaaBtRttaataaRRttgt +aagKNcaVWWgtatacctgatcttBtcttRgaWcaVRKcagttSacttagcgtKtgtYWa +tatcgNttcKaccacacVKctgattBtggacgtctgacaDtWKttattttgMBgKaacaD +ataattWtBtBRtVtacataaatatttgtWtttatagtDtgcctagctHYaatgcaNaaR +caatVtacctgggggKtagBgagaBgRaaNttttMtMagMtgtgattNctcNaKggWtMa +tcttagWgtaatatatNctaYBggKaataBattYtaattataVtggNtcgtgtctaatta +aacctHtacaaactDctDtctgatatgMtgataacWctgtgYSaaNScgDYaWtatDatM +KgcaatttctgNcgtHtaWtagatatcYBttaattactcaaaVattYRWtatttDtaNMY +MttgattataatgcgNggWaatYagttgBagNcaagaaaDtRgtaaaagctgcatctagc +ttaVgtBttatagcKMSaattYtHcMaBttcagtcttgKatgVSVttKgttttttagtgt +DHgNggtcaVtatttaacNtgaatatgctatMcatgaaaBtgBSaWctaataaattatYt +tagtaDtaccggaatgagtaattggatttaacBtctSMgWYtgKgattacgRctctccaa +tgtaggcctgaNaatScgYataaBBacaKtHtttcatgaaHtgBtagaKHVtacctVtca +accaDaaWNHNaatgataattgatgWcagggtcMBtgSgRataHctMctgMHHtKaBtaa +MtMgataaRWtagYtgaaMaSgctYtgcgaaHatDtatgtcWRatKatatYDcBgNtRaR +acattMcagaHgaaagRccgcgWttggSatBagagcHgYtatctVtcatYaaVRtcaSac +aMYDcgRtcaaWgaRgataMtaaaacaggtgtaaYcattgWgDHcWgttaVatttgcatc +taatccacaaagaagSatgcgtagRgagtHDgaVcgtgcttatggMttttcatKSctNac +HcctMaKRatttgatctaaatgHaaScataataatgtttgtgtHaVcaaaaNHaaaatcg +ctgSVtattVttagaaNWcacagtgKtatgattHcYcttgDaWVataBatBttttWtaac +tNaattttctttaaYHaMtttaaaccgStcHaVBaatcRacaaWactgtagVKtNRtcct +agcWaatNgctKccttctcDaBDcatYHatatgcaataaBaagaatgDMttaHcaaYYtc +actgttRtgacRaacctaWtBtBMagBctaaBaWtgatgVtttattataggttaattgta +atYcaRtVctcttgcacSaaMaatactRSgcataKcagcaVNKttcgSatcaaactaatt +DtaHtNaVtgttttttaWVtatNccagWttcgtatBcgttVctcBttaaaaMSaDattKR +cctttcataHaattaatWaaataKcaHVaggaatataBYKHVtgVcVgtcHcttccgcct +attDtMMgWaacttgWttYtttcMcgtcctaaVHtgWtggtgacKtcaWaYMttacttag +VWtacgSatatcgWcKaaatHKaaaYttgtagtcaacWtttggtcaagttgaaBBaSHac +VcgYgttWBSRWggtattttaYDtHatattcgatNttacaaaaVacaMccaaYStaataR +ttVtcttagaVKaacaWcgccgtRatcatctaaatccMcctttaMggccHgYcDgaKcta +tgMRYBagcaNDtgMtcRttgtgHaRttacatgaWcDtgctgtataggNggtgaatagBg +agYNtatcagKtHcatBatgVKgaHWagattRDatatcgYcHagRtaatgWtcStagcVa +tNaaaaKttgRaRBYNgtaaDtStaVRgcMccatMWaaattBDatttaatttataaHtag +tVVaDRMKBtaacaatttttttDaRSgaaKDtVaBatcagtaaMttaagcctRgaNVggg +ttcataatagNatcctacactacgcatgtcggaYgtaKcatggattgactttHtaattWN +RaaWYggttcaaaggaaNtaatgcHcaaaattBtagcttattcaagVtatttWgcctaKt +atBttDYcattagDacKVaYNccgYaYRaaMaattRaagaHtatgcttgcRagcgctSaa +tagaaRacaRacSccagcacVMataatHgRtagcgaKgYRaDcVWSDVgRaMgcDgtaat +tttaYttggtaaWcttKDaaYtatMRcgKccYcagtYcBgRccattcaKtgaSSRtactg +acgHtgtaaaaBatWgcaMcBcYcgccagactcttcSatYattgatgaNccaaaaWaKat +VgcaggtWtBcgttaRMagcaaagtgttcacatataaagaHWtKatctacttatatcacY +RaaVagataagtaattttgatgtBctaataggtaRtaaHaattgtaRcStYSYaWRgMta +caHcNSttVNScattNKaaKgBtagtgatYcaaaStactggttggggaBggtNtgtcaaW +BaYVSNgtaataBNtagtatatcacMcScccVcgtVRRtttNcKaSRNaNtHRttattta +ttgacaatggSaBagataaccgttcctaDNaattgctVtatNtHtatagSccaagctKtt +aaacaaattattgtSHgMWgStttNaccattBMYatRtccStNgttgaaBcctVagcaaa +atgatattcRaBccMWaagKtttttcMtgaRYNaataDttgttWRttattggHtNtataa +tggttgtStYgaMcYVtcattaggtaatVcaNggaRtNataMWcctcYgcgagagRgcHM +gcWtgaYtVSttgDaacgaaaatMttYWtWttcctgaKNttatttattRaattaagaccM +KtttcWgtcaBagKSaWaaacaNtaYaDtBNaaagWtHgacaaagtgVtcatKcgcaatV +aactatgcgaaactccNctatatMgactatttatSaaVttNttRttagHtccKtHtaaaN +atttYVctaatttaaaatHWaNtSacgaaaHggaaatcacagVYcctaattcMNtgtYtg +agttatttaBtcRgBHNacBtactctagaacgcKaaDWYYgcattactVagaYtgaVVcg +caNctttBagKRcSgaaatttgtatccattgtggHcaatRtaVtaSaBtcYYcatcgtgt +cHaVttaHattctgtcaBSNYaKBBattaatggctgtHatattgtBacDcBgatttaaaN +tggaaaaYtNcaKagRRtRgttRtMtWgggatcNtacacctgtWKagatataaYVMtaaD +taaacctctgtgtgccttScacWaggaYacttttKacgtttgtgataKYagaYaVatcWc +SattaMcatBYttYaaatgStKagWattKtttaWgtagaaSgtRattcSaDagVaMatta +ttYaagccSgcNaaDgaaSaggtaNgtWactaWcgHctgaNatttttcaatgtaMHSWaR +tggtaNtaHBtttWWaaatattcVtBtctStWtaWMaBcatttcDagttDtttatatgtt +WBtNaYatcccSgtgagcgaRYtBtagaDacBtaagaataWactaaaagKtaKaWaataa +cKcccgDtagccaaagcggaatcgctSRtacKgcactacccHaactMgtgccaBaRaaaB +VtcgSacRKtttStgatcaaHgKtaaKaccHaccacccKttgagcttcSttttKKcgacB +gggtYMaatcBStcgDBtMcataWtaWaMtgaataagaaDatccSYDtgBatgactBaVt +aagatctcNMgtcaWKtgcWggcgatacgtgtttatttWaDaNWBNaaNtNttcaaatag +taatScgHtMWttgttgaBaDtgNatSaagtttHttaNaNKaattKatttgatcgtVcat +gaatatBtttctaacKaNttVttSagccatRtatatcactcHHatctWSKttaMacaaDa +ttccaRaYttttagttaatattcctYaacVactgctMcgagcaMYtttgaagctagtKgN +WttgaaaMatcaMcttcSVatcaatgtNactaaBagatagagtDMgtNtNWatttSaHac +tagaaaDggtaaaaNctMaatagtaHgacgMaaacMtacatHtaSagaHatYDccagtBt +gaWatcYtVaagataattgatcgacctgcaacgttttattacNMWNcattataDVDacta +tattatYattttgcgaagtgagYVtagYaWaHaatctgWttttatgcHaacgttaccDaK +tatagaccaDDttaacgtHBaacatccgtYaBtVtNccaaataaaatVactDttSKtcMt +DSgaagctaMtatattgattactgtNaagNBcagHaDattaaaWttacacaaatactcaa +tSDatagctcaDttWactttgaStaaDtagatSaaDtgtaatKtgVataggaagWSaaaa +KatttaaagtttgcgtaaagcccggNWaacatacatgttctaRcaHttVtcattatctag +ttttNcataaacDttWaagVtNYtaggctttggtatgagaWgtactNaVatcactVttBK +cttaaccttcMtatcggtaataYaMaYggttgtcaaagSWHctaRMSatVcggactMata +tccgaatcttttttcgagtccagtttgaMtcgcatcaaKagtattRMaaaKDBttDNcca +tttttaaBNtVtccgtaatgaKgtcagMVSattatttaWaattttaHNcaaMaHttgtgg +ctattctacDtgaagattatcgacaaVRHttcSaSaatactNHWaaNcgtWaWgaccgRS +ttNtHtcttcKatYatatBaagtcgctBtgagccatatScctKaagaaKDaWactWagBg +ctgattBagKtgaaataBaaaaagSacScaaagagtagcgaDaYtaMcaYcKtaataMat +ttttaactttgYgtcgaaggacgcHctBcgYgaaVacRYagagBaaYgtagattgcgagt +caagtStDagatBgtgaccctaSWtctDgactaSHttctWatWttctaWtatctYacact +gBWatKKctgtatYgacaaHSatYSaNgSagtatagatgagtatttatgaccMaatgtaH +tStaWttgYagccaWattcagtBaYtaaNaBtaNatactggcttWcaagatDctacggaN +ctatcacatSgKgattgacgacccccgagtNDtattgagaaatattaatcVttNKtaaWt +YacgSNcBHgttgWtatgtttcgccaactKaattaRgacgNataatctacaacKgttBat +YatNMSaaaNtctKgacttatgcttatKtcaVtVcagDaataattYgNtRtHaagcaata +HcacaVgtaNNHtHDatgttaMNtggWagSVaRttcMVDtcttWgtRttctacKaaVttc +VcgcatcctHRKtattSgttSacgaagtcccRDVaacBWagtgYtKtgattgSgaBtgcc +BtcaKacaDatacttHatcattNatttacgtcagtgaggcBtaRNaRcaSgcatattatS +tatgctYcacgtattcattaaRtgStcttWgtattKtSYttNaHaRtNYcRaYtVtggtD +cKcttctactaMcacggcMtacgcttctatatHtaatggcattMDtaaMaKattgaagtB +aaKMVMNacKaDtttKNcgagctaaagtccMMtgagaagVaataatggcaWaaaaVaBgt +aSaVgaaaSaaaataDttVtBccaNagcSBgaMaDaVaVYYRVBgttYMtagtaactDta +agWaattBtattttMDYHtSaStScRaKatattacacctMttgNBKtcRtRggNagtYMa +ttaaatMctYgaatgcKHagSggaaaaBcaggtHtatWcatcgtStagMcctcatgatta +WRcStcgWtgRgttttcctaacatcgctcgDDtRaatatMgtcMtHtMaDYatgDattta +tagctKDtYHaaaaattaSatatctggtctttattttatMtgtYttgtcatactcaaVcY +BgatgSctKtYcctWaRaataWcMgNgcgggagtcttRMgactataHaHtgctNtVaatc +aaccacgSRaDtgKtaaMSKgtaaaaWaKtttVagSDtaaaaaatgttYattttNagMHa +aRtNgBttWattatatgcttatatcatttatKtKaaaagctRaaatcgcYgacgNtacNt +ccVtSaaatttcDVctaatacWgcaMtcttSaaWaaaWagtagtaattaactagRttaVc +SaaatataacHgHatWaattggaagtgcgSSgaaVtgYgSttccatWVataatcgaatat +gHtRcgtBttcttaaggatatgttgtBcNtaatgtcacVatactgaaatMBttRRcRatc +catagagggacatcgccWttagttgWttatKagtaaaagHtttccttSatVatKtgagca +atttattaaYVattcaaattctgSattRaMtgaatMgttattattacaNcggVagcctta +aKgccYcaaDattWtggMcttMacWttccMVgtgaattctDaBYgacttKYtBacatgct +DcRaaKaaRaatatctttagKcKtaactttaatNaaggctgScacctYgcgcaaaccaHt +tVHcBaDgtaatHaHVaaatMgttggtSatHtNNaaVagtgtacaataaagacgKttcaa +aWVacagctcacWHaatcctgtBNWtaNMKcVcVSWtSgcaattctgKtVVaaacaRaat +tgatRcgBacaKacVccVMactagcgMNaaactgataDaSgagaatVHaatVSVtccgga +tgRgtagRatttgtaactaBataVaggcaagHgaaSMSaKgctRagcStNcatttVgcta +tacttcNDtcaKBDcaHtDcaatagttHttattMBgagctgtaaagtMgatStStcagat +atYcBtataacRcaggRaaaggtaWSatKgatatgagcgtgMYatcagcatVttSgaaaa +aatatatgttYttcattatacataatVcacgattataDggttBtRaagtHMtatagaDgN +ttggDaKctBcaaRcgattcgtgccttacaaaWattYWVcaaWagDattgaaagggaaga +HattBtatVggtaHtWtaMagtccagaKttSatatcaStDtgWaagtKWaggtatttaWa +aRcattaatStgaaVtacggaacatKctacatHtaaaBtcNWatttBBaNatRcDattcg +aactataaattataactcagtSgatataagRaYaKHctggtaaNtttaaNgaRHtttatt +atacNttttaDccttYgtaaacaggaagtgataaacatBgaSgtaaaaaaVcBgtWNtRM +ttBttaaBgtaaaatatcHNStaBtaggtaVatYaccNtBaWagRctNSacRtMatDact +StVctaaDtaYSRgttaRNttttKggccagaaBcatagtYcaYNtDatcgtatVcaatWR +taggaattMcatRtgggatgtcMggMtttataagtaBgtggacNaaKYtgctWgagYtWc +ctWtVcttaaactaRacatggtRcatctSDcHcMgcaactttttagttaccttattHRgt +acggcactDBggtMHcVaaRatKctSHacctacaccactaaHaacgSttagKtKttttgN +HVgagtaYaMtVYNVcggttaSBaBtaatttSRcgtBgaWaatctttttKggacaWKaat +tKSaccttgDRgtcatatDatVMtMaVcgaattaNaagMWccctaaHgataatatgtatt +WataaaatBaaMtgRttcHctaagctaagatatattMcggactaRttttKaSttactWYt +gBcaMMacRRgNtactttaaaSKtttcaYBaBttaVagtRtHcWaggaVccttNgtgagt +catataWttYScMtWgVRgattWtaSggacggWWctBHatattataaKaagttactaMRa +aataSRaDttDaaatataVHaatggaaBDgWgHtcKStVcatHtaatcatggBWaagHta +gtMtgHcHtcatggggWcatacaHNHagcDatRcaaattcgcttgDggDNVcaacgSgtg +gcaccttMttaatattVYtVgaagRttaBcagVaYaHcaRDBagatgaVHtNMtcttact +DaggMgMaattRWDcctVtgagaaaaSKatHHttVDgtctgtcacatHNttgaatSaagt +KBatatagacaaRVctcWtgtacKtaacHtgHataSgVtactaggtttatggBgtcaaaY +aDgaaaaaatcgMtagaKaYatgaattatYcttKtacaatttgWttMaatBgaatSttMt +NaVgVtScgcttctBHKgtaRcNBaatcDtacgattgacgtgctatNaaBtMgagNgKct +tWcWKacactYgttVgNcgaattttcttgaaaaactacccctcgcNtgMctatcccacMc +actcMatttatttagtagaacMNtttcttgYKaWtaaBtttcWttagHtgtttctcttgt +ggctatgDgctaatWDataatttagaNcgcRRNataKtctaataHgaaMYctNaKWtact +aacDtgaVcgagaactggtaccaactHgaggctagagHHagtMgKtaaactacaggMatg +tYgSBaKaaaattMgatRtggggtHBVgttaattgKttaaRDacgMactcaaacStaaag +ctctgtgccttcgtSagtSaRctacaataKatattctaVgtgtaattRacKagttattga +MtaatgaNatacDataaggactttccNtStatatKaagaataKtatggtcctctatgagg +ttaaDtgtattgataaaactggatcactKBtttggcgtcaaagaaaNtagtWKatctaaW +BactDaBaYtacaWtaSgcaattattWgaaBgactgaKctatBRgtagttaBaRRgattt +aagBHctStgtVYRtaaataaagtMWtcHgcattcacaaMWtcMccWttgVgcHaWttca +NtgtVaggNgcVatKttataaWDcccctatgatVttttattacagRBBWttcttRaWgaa +tBVgcgtHgWgaccagtYacaattgSttaaMcVtDatttaVttRgttKtcaYWatKtaaD +tttWaYtaatYctSctatagtcctBtccMaMMtaMYHaSSgKaaacttctcBtMtgDtgt +ttttagRcgtacttataHgKtNtMtKcBtaNKaHStgSagYHtataDtcKtagRtNWaac +VgctVtRtttStNtgaaccttaVatgagaaggtcaKSttaDataagcYaSatNStcaatD +NgttcgacaatttaSgaRaBNNacattRatNtgSttHVtgWHgtSHccaactKttYtatH +YttVtgHcNgactMcaacttBatatgSgattttacgtatttgtggtScaacggYtHtgca +tctatttttWtaSatcagaYatcgcagtgtgtMgtattctttcattaRatttStcaatat +gcttDtStaaagaccDcVtaWNcHYtWMaMcgaacKcaNcttacctaBtgcDacatcaHK +tRcDaaacataaRacNNtccDataNactttatBSDYatDtctBtaBatctDatKaMcatt +MatatcDHctaagRgYVcatgttcgtgataHDYaagttSgHYctaaatgtaaaactNgta +gaaactaattRaatcttttBKcgaatSctMaggVaVaaatgagataaataSgttKgtcat +KaKatDYtaaaRttYaMtgctcSatRtagttttagcaaNtaKgatcgWYcacDgaatcaa +tactgBgaNtaactaaWatatacaatacactaNatcaVaKaaMaaaaaatcaccBtgttg +NctaacaBattttaaKWcaggataWMtaattgtaaHtgVtcgaHtScaHtctcHacVata +gtaMcaaKtcccSagMYtWcaaatHHtaagRttDagtMtcYtttaaWWaaaVaRtcHNtc +tcSttagcacaKttgtagtNgWYtatKDtcatttgaacctcKHtatccttattcttNggt +BgtgtKaggWtYgtStgtVaRtaRaaagtagtgtcgcKtKagatgagYtttaatKcScct +gaaaaaRaaHtttttaaaVgtatagKctaNtKaSVgttcgagacattttRSatagttSac +ataMtaYHccacttttctatactagtatgaBaagctttaMtgaatgtcaKYtaaatatgg +attataNcgBHatcctaRaaactgttgacttYaHtStcatcctDaMBttgtaWgagtaat +WKataaaBgBattcttttctttaatWStaatacgNaagtWaMaaNgactMtgaaDaggaa +aSctaSSgatatDttattatcatagBcaataVcHcRgcStaHaaatWagatHttMHacta +RacttaYaaaaNtataHKVaataKtatgatcgtcVaaWgttYtVcaaYggctRWttaaKt +RttDaKtgtatcaattWKaatBHaaaaNgaatggStHgVVgatMgBYtaRNgBDttMcNt +ggaNgtcaHtgttDcNaggBtatYtacVaNttctcWtactHYcSctgtYtDtgWaatcHg +atDatatcHtcttatattaaKaRYaDgaatgSYcgactgcRgaagttagtStYatYtttc +cgacactacagKcaaagDttaatVatcttaaacRaDatRcBatKNtNtaaaHtcBgatKH +cWStSRaKaSMgtaKaBacWgDDttgYaaYttaNtDgHtatSaSataaaaMBaaDtaMat +DaagWtggaMtRcacttatggctNataaaaatatWNMtacctatgtcaYKaRacagttHD +agccgtaaYcaatataatcatagggaaSatgMYBcKBBtaaRVRatRtccVtgtgaagVN +ttcttagtgtcWataVggtaaNaatVgVaKctttNgtttagtaaagBatBtgaYSagHtt +SYaacaStcgcagaSttcDBtKtttggtctacNttgNgKNNtcaaaaKWactgaaYgaYa +ctatHtaWcaactgttSatNVtgtctSttYctgattVaatKgtaYcaaattSgttaStat +ggtccaatgSWccaaactattgccgttacgcNatcHctctcaKatgtagtctattttaag +gHRatcDaagSaVgaVNccaBKtacgtttStagKgtctaHtcattaYcctaVKtttaYaa +atYtccgataaaVttcDgatWcgBtcctaatttNaattgctDYgtgatcaatttaagggc +tctcatcKattgBtaBagcaYcKctctttNtaacHacNStggRtMatHHgtacatgcaMa +gtgtccatRWttRKctaaaDtcMctttaNVgaNtcMatcacHcctgWtaaStcacgtctN +aagRNNaagMaDtactDgctttttcatcYacttaKttatgcStDaStNaMgDtaacKtMt +acctaaWattggtttNaaVHatgaaattaattacgVNaaWtggaWatctgVatcacYctc +VHMtVaNacNtcccaWtttgcaacctcWctHaatcttWcaaaYaBaattSctYatctaag +DgBttagtaSgaWtBcRcKtccYatatcKBgtctttatgaaHDcgNaMatggatgtWagR +ctStagagaagaacagctWtNtataaaataRatHatKgctNactHgttRgRgVcRacatg +HYaNttaHtattaNStaagatgtagaHcVctcYgggccYcaaaatgatcttctagctctH +MaMMgcaVtgHgtaagaWHHtggtaactBcaMNNctagaacggWtctttgaggHcYNaaM +HtaYcttKaagtSccgttgggNMStatacDttataaaVaYcKtcgcattttcgacctctc +acVttNtttattgtcttctaVcatagaattMttgtHtMgacataaatagttctMtgtWgW +ctttcaagYgcgtNaagcaaDaVHaaStMtaaagccccgtgVgtcacatcHVaDtgttBt +BacBtcggYttDagaDYtccMttagcttacNcgaagatRtDataRtgctaatatatgRtW +VttatWKtgcBgactcgagaSgtaaaaagttaaWaaagtatttctcWtatcBtcataacN +cgctcRKaaDKactRaNtagtatBtgaaatttcgcDactttaNtYgagagaNttgaatta +ataaaSMattRHNtYtgttgaDBRBttgWttagSatgacDggNVagRWcggctacDaYSg +aaattHgtYaaagctccVtatacattaMctttgSgacatBKaattRgtaBRtttaactat +tctagcMKMtttctgtgtgVgtctttcDcgtaaMtaggtaaaDtcaYtatccgattcYtg +aaRttctKaNctaYgYaattYgRttWctWttaaaccaatcactVatgcgYttgaaatgat +KBcNRgctcatgaccHagcgaaaatgtVgccatcaBSatKccRStSattaaatttggtaa +gcVattctgVcattMtacatMgaaaaaataYNDtDaatcatWattcaggNcaccctcBtg +cKcHagYtatBatgBttgtVttaYBgBgataaHNtacRtcaaBaKcagNtcagaatYgtt +WgggaNDagtatagRtctcDtDaHScagttcYcatcSYacHcagagNgtgcHagtacagc +tgRtatatMtaatRaWMHgaaKacaBRtagHtaaaNcVHcatWBgWaaacWccggtaaRc +attgMgttaNgttVMVttgcaagagaatcaaaaaagYScKVtgccgacHgacgttcaMcc +tcattatgcBttttaagtKatDactccgBatHYgttcatcgaaatctSaKaagaatWVtc +gttgtcttaMaaYaSDtaaaataccgcKMtatgKtgScaaDMaaaactgtgagcVtttaR +cttgtaNMatatatttggtMgYVatDaatttgctttaaRtaBgttaYaaagKtataMtWS +tcHaaaaNacgctacMttDDgactacaNaatBcagtcattatatSttaVgRtWgSggcaa +tSataVgSYgctBttataaYRRgaactgtgHtgacHWSactYNgtttBactatWStaNtc +StcMttgattStacctgaattctWatNaaHgMatattcaaaKWaBaataatHKgaWgata +YcaWMBtgtacKagaaaaagaattttWttDaMtggttgtgaNMtVtDcaacNttactatt +acggKctatttaaaaBKatagttHaatggaatatYWgtaVtNaaYgataatMaccWagag +atRttMtgKaMcgatattaacaagatgttBBcNaYattcNgtRttgaBcctaagaSMttc +MtcctcYattcaNaRBttaatgVcMNgaacKagatcgNctaWVgttaaYRtgctSctaaa +aNtttgctaaScttcVattaHtaaMacNgttNtKHMcctattttaRtttVtSgtacatBg +tVaaSSaMVaRBcaSaRHtaWtWHttMtattVcaMtWaaaNaccccgHYtcatagaaRta +aBaatttaBccaatcRctcatagWgcBHRtacaaDttcBgaHggcgctaHtgacagcSNa +ttcctcgagaccBggtcaagWctgVcRDgVtaagtttaattatcMtgatNagYttHtYta +gccRatagDtaatcNtaKtacaMSgDaaaatttgHaHtRDgtaattKtaMHgaBcaWtBN +YaWgtttStttaSttgataatgactMKatHBtttaVcYatgggttttaDKcSatttMata +tcagtYaBtgVacaatHcaDMcccgtaataatagDataatVaaagaagaVtctccgaRgt +RtaatcgagtcacttgttSatgNDHaSNRcggtaSaagcSaBgWSgcatcaaWatgttac +atgattcWacMtagtgNcacgatgatttttRcWttSgtaatMRRBaacNWRHaaBaattD +aagStgatccttcaDacccctKaagScSSHaaYHWcHcaWcaaaMBataattgDtagccW +tcRHataMNKtMgHaBcatcgaagtgtaRgtgggaVMatgttaWRtStBHactaaRaact +NctcHaaaggcatgcVHKHgaatcSccttggSaWatWtNcaaBctaRagaaacacgcttc +KatRattcWtgYDaaaaaaNatWtKgaacgtNttactgWHBaccaWacggttcaaVgaga +aacVtMttatagaagtatWtaaaNHYaMacagWagtaatttgcatcttcgaatacggaHt +aatVattctaDaHtRKRaNHcttacatcDKttMDKaWggDtaatcttYctcWtRaaaaKt +aatcctgccccatgcgDtctaaVMtWRKKDctaatatDgactagWtaaaBcKcacMactM +HHttgDataKHDaDttHttatttagtcaaVatccKWtacWtSVcaggtaatatDSatgcc +tKtatDtttagacKaaaagcgtttaaSaaaYtgattgtKtgBMcKttgDaaaagttBRat +HgcaKgDgtgcWataatMWgcVaVatcYgWttaDatcatNaVgtttgggcttgaHRDaWg +atttctgMHgtVtgccttBtWtaatcgttcgKgRcaBaRMtaattWgctaatMaVBccaH +tDagaBNaataRcacYcYcHcatBgaNtgaNgKHttctYaacaaaYgBttRNtNggaagc +WtDggattgagtHaWttVacaaaBtgttaNctaatactKaMaaaaaDtaRatttDaaagN +ttcYcaaactcMgaYgtacaaatMaaatYtcacVaacgaaDagatWgBgaataggtWtKa +aMtgDttHtgagttaatttgVaaDagttNMataatttaSVattNaDtKVccaaatcgaYV +taaaacKRaataatgaBDtctRtgVcttatttYtgaHgttBWatgaatatacSaacctSa +tNNRccagtactKagaRtgSKMcgaaDattttagtHcKcaaagtggtataaaggctccta +SatHtaMtRKattaNRcWtccgctataKggatWttaggtaatHDRatttattRWgcgatc +ttagSgtcttactatgYgttYaVBtgcaYaaRtDaatacHHtDcttHgBgNcccataDta +aaaatctNtacatatWaRMBgaattaaaacgctctctcaagtKcacNacgVRVcttttta +acttgctcStatRScaRaMataNaKagtatcattRttNaVatcKgtacNatttttgaNcg +acaaKctHWtgaKStacMaBatgWttNSacaaKcaDaatcWaKaccgYBggMScgaMcct +agcaDatgtttcVatgtRBtKNWHtcctWDtatttttNNSaatattcMttgatKgNgaNB +atcSggtctRcttttttatatggtNttDYNYgaaaKctcacacYHRgttacatacttYac +aataNaagaaaagttataNaataSatacagttScacVaScaccSWtccagKHtaatcaaa +tVacatWacgBctccaataHaaYtMtacKacHttttKtcataWWtgtgaatWaataaaaa +catttcaccttaHtttgttccaatcccgRBaWgatKgagtttBaVgaNtaNVBgcaataa +gaatagcaKRttgtatcaattaMtaacatataDBgtaaNttcaNcgagatYactggttat +gtNVtaBNtDaaDtDttaSaWtactaVtHactttNttcttcatWttcDatKaacgtttgg +VDaDtVagttatgtcagactKaatcaYtSgttttataaataDttKttKagacWgHgatat +aaatcttagatNKtttWtWaaatattacSHaRgtttScttaatWttacgRRaaMactcat +BacaccatRtttgaacctacttcDMggcVaSBagaatcttaKMagcaVtctDVataWtSg +atagacttBctDtBNWgtgKatWctYgaaStccgVaaaDattYatagtatcaacBaWYct +gaaatttaKVgYtStNtcaVggtggaNYgaRtMaacataSttcagacVactcaVaagtgg +tattaaDBNDaagtatatMtactatatgatRSgtttgccaacgcacRMtacRYNataaga +tcMgttgatcataaacttVcatatgWtacaaaWttggaaactttaScataactRattMtD +acVYataaaagMaattttKtgaBttKcaacatattVtagtcatgactcgDaacDtaWcta +tRttSSYNtgWaScaaataagaaatKtagacataatggNaatttcSKtVWtgacagKWat +tcgVatttcKWgagcaWgNKaaaatatgtaaacgttcactaaWgacaccBNaacagaaSt +ctgctaHcVtttMtcYttStagYcgtttBcRtaYacttgNaacMtDRtagcatgtgcgag +cScaMgtaatBaKataactMttttattaRcattattatacgtaagSNatVRgcttcgaVa +acHNtctaHBKYgKaccYcttagagcccaVgatttgttagactaaacgtgcaBgccaWga +VataggattDBWaattttgtBacWtttttaatDtMgaactaagcVtctcagBMKatgatt +gaNaVttggatDaSaBatttcgccatatgctaattgYacatgatccacaaMHtttcKYKa +WtYcgDtNaaDccgNaNcacacHKttDtttaggctagRVtYgtaactagctttcacaaat +YtHaattYacaattaMSagMactcctcatgtScttcaaYtataaaaScHYaKcaYacact +VcacataNtaBcaRatgYagVBatttgtaactttgRggacaagcVacctattacRcaaMa +cHRagagtaVNctacagtgagacgaaaggKttacattgggacaataKNtattcaagWKtt +gatNagNtgctaNgagatNacSatctNatttatctatRgaaaatKatNKSBcKactatac +StcagtaggtVtcaaaBYYgctattKtWNttcRacaaaNatgaacttaRtaaDSttVBYt +aatccagtNaaacRttagaaccRBatataWaatKctcattcSacWaacaacactDttVtt +gacYaagagtaSgcMttBttaVNgRVagKDcttcttcNtaggttgcgacYacttaaggVH +caagDagaagataaVaatctgtatRatDtKaaSDgattcaattYtcatgYgtgaVMtMaa +ctaagaatgRgDtHttaaccaatStaaaaMctVDDtgttatcttaBBgccNacKMaHggc +BMttctgNctHggagaataYMgtaMccaataattHttYttKggtKaccaactcccHtMSa +atNactcRtttcatgcKcatgcacttcatSaatatactttVtaYttDattgWcctcactc +YccattaDDaHaaKcaatSttagKtWtcatRcaactattaattYaDggKtagtNcgSgtt +tKRgtDWtVHtDNcHWNtKtccgtctagtatSctaBcacgcaBtaacatgagatVtttaa +ggcaVttBttaStWtattgYaggtSatBMBDactVtggttDagacataaactactBgcac +aacMaagaStccaWNaaSYMYtgtaKaMcYSaHaaaatatttMgtcaaDScaKtcaBVta +MVMRRDMtcttRBgWctaacttgaacNaatgttWgtggBtRttHVKgKcHVtatattSaa +aatBttcBtttcDgHccBagtRBRttaVagBctRcaagcattacKccaWVWtaVcggtta +tNaSgccgKtYcBaagcWgcatgaNHaKtagNgcHcgtgtcataaaatagagacttgHYa +tattctaBgtttatRatctatttagacattttNtWaaSagtaHatRtctcggatttatgt +gatBtctRggggcatWctaSVMaRtcatgKattgRcatMaHaataNcBcDcaggcactat +tHBgaatStatattcatBgMVataaSacVacKHatggttaaBKtgtaSaWMattttMacK +tgaaWaaWgctgRatgtgDacBtSaHtDgtgtMVttagatgattagagaSttgattgtSa +aacagHaaatacaRcaccBtaaDtcaMtKaaStttatKagaataaNcaaBtattKaVNaW +aNactagtYattaaagWgHttaMcKaSagatSactctatMSagtggaYctcacKKgaSMg +cRgKtgccagNMataatccaVgatcttHagttttcttaaccataggggcttaDtYatcga +aaMataagcaaatBttgHHcHagacagagaggcacWtacccMttacgtgNttattYctVa +aactgttaagtKatMagttcacaaagggatgaVNMatgcaSattatcKagtHaBtgaagB +cggagtWttVaaDaccMScactgVatccaRaSatattNtgcBatgBaaNgtcaBMgggaa +tgagtatRgaatgtNttacaggcttaHaataaHSagatagtgVctattaaagggaagDWV +ccatcKaaaatRccccaSVaaatttMtatStgtWagtStMaaatBctgcctKWgttDDaS +KactctaaVRtaSWcVactggaaaaNMaaaccgcacNtaVgaagcttDNgaDBtaMaMKN +tKccaVtgctcttMMYaaaaHaattcWgHcgtacatWaMaaKtaataccgBDaYRaggat +atSKcScYagMtaatKHMtaaccatgHgtagDaggtgtaaatatagaKVgccRYctcRaK +BKWtgatHYcaHgBaYtttMcatataatgaDttcatttaStgtcVSgacggtggVgtBtg +acatgtaaSgtBgatKtKtaYcatVtNattataaaHaSccHaaagctSMKattcatagca +cagtgBRataacaatMttKcWaaaaatagStcggRttaattatWaataatMaYagatgVt +atccttttHaScgtBgagWcatgBtgcctatcgtaaWHacagtactgaattaaaaaNatt +RNMaSSNSctattcaaagccVVcatattttagMcgtattNtVBactacScattgKVtata +aKtttgNaWcttNacctagtgaNaaDcagtaWgKggaaKtacgcaaaYttatacSttgYa +YttcDNagggttVDagHatSgtacYVatataVattataSataacgKgatVtVacHYRWtt +atcctaaDtgtaaDgRDttttattWtaaDttggatcattNgtVaaaVggaaggcYgSWaa +attcWHcgaSaVWaMatctMDtHBgttttaatctaWaagatatDKtVttaccgaMatRaa +aBttaNagHatDHWcDtBVttaatKtMataYttSRHHcgtaHDtggttccaaagRRtaWt +VctRcaNDttatacgatMcaatNHtacgaattBaatHtcccatctctccBtgtataYcta +tgtcgaaDYWtNggatNcacRtMaatNtKcttSYSctaDaaaggctDaStatKtataBgc +VaatttggYcttaaatgatgtHctaaccaactttgggttcMaaDattatKtVacgVcSca +actSataSccHttYctttgtggcDtMcactaNSBtMRBMaggttWKtattaatgtKHact +tcaMVatctgttgtccaaYNtaagttKaacttctHcgcWtYttatMBgBaMacaattaDa +actNaaatSatcVtSSgatctatgNatSYaattRatgcDgtctataagagaagRgatatt +tcccaataHgttttWKtgaagNRtctaaBtWcHHcDgaattgaaaKtgttaaRtatgtaM +aggDttcMaccaMaattDctgYctaWtStaNtgRKaBtNcMHcSttMtaKccYacgNNct +ttatStgVtaYtaagttaagaBHaaStVKHatgttRVWtataMtSatgcaattcMcttat +KgMcagtgaatcYtcctNaYcttactttctcttcatggcgNcatScStBtagctWtHaaW +attaccgtctcgtBMcaaacKctcccaacttBgtWStVttMRgKcVagHttVtaagMaNa +tcaHttacatcYKttDBtatgSattVcgBcBVYttHNtcatKgcYgaaSaKtatttttMt +ctatctaSaattDttcWagHSacgttagYgacWaSaDKatcNgctaatgVSctgctYgaK +gKtaataggtggagcgtcgaaaaRYtgYWYSaatacBgacWtaNStcaattWtRctttta +aSYgttcNgtBWWgtgaatHttttBaMcMtKccagtattttcgaHaDtSVgatgaacatg +cacgtcagagDYattBcagDctcttNcNtaaaatRctgMcDacaagtttagtcaaSSaag +aaacatacaDtctctYgcaaacBcaagaBatgtattgacgagYacBDgttcgtgRtaMga +attttcNtgVcttctgtctagtgtccatatctgatYatNtatVWgttacaDacaHDDagW +tgataWtatcaaBRatDRtMgVcgaaattcSMagYgWacgggtaacaaattcagcatagS +gttactBctgSVWatYcYgcBWgggRcHtataSaattBcagHgcgcctttKcttWaggct +ttaaDtRacBactaaVaaKtaaacctcgcgccattactKactKSDcgacaVtatatagga +taKctcgSatgHSatVcgtagtgaBtSYtgaBataatStaaccaagttcaDtHtatatta +acYatattatcctacgagatcaccgtVSttctYgtcataaVactcgWtaVatttgttgga +ctaaaVcaSaDtYcgNtYtctVaMtaattatWRtWcaNtaKcaaYggatgNgaatcaatc +RtcgagtHcgVgttataHDcatttaagttctHtcgMRHtaaagaVactBMtatgaagtaa +aaaBNtataaNttcKcctaNttaaDtcgMacgDcaMatttgYtaaNtcaccgatgagMtg +ttaggWcacHttNgtcttHYMcaattKcagttcNcaaaacgNaaSattgKttaaBaKtta +tttaMggHcttttaaRNVgttaYttttMVRtYVgRatKcgVtacgaatttccBatBgYBR +tSKKctaaaatgatatgBtcttcgtttgacHagtaattatatctgDtBttatgaDtatKt +cKRcRttagattattagHgDNaaaKgcgMtHtttKtDtgaaaagtaMatcagaaccgaat +KgtatatVaccRaKYtDHtcSagtBgtgccWaaaggtYKcaHatDDaaattDStDtcKgg +tMgcMtgtHtcaaVcgtttNtagtNtgKgctaDcScgBcWSatgtatagcKgWgttgaac +gagtgcgcgtKaaaacgRtttccatatatttttMgaKagcVcVRataccWctctcgBcga +ggcgttaatgaHYtttHtaSWtagcagtttKtYaacaaataMtaNDatRgMBaBacSaat +aSDctgaactattgataaRtaVtttHatWaacWtVaHaaBDtactYtaDactttSgtKtR +attgatttatatattattataattBatagattctaacDcRMaaggttcgtcatattRVYc +ttKgtRcgWaatcgaaWWatDctacaaaagaattHaatctgttttacYatKatBaccMaM +aaVtcacStaaYgYKgtttctcattatattNgSaaHtgRaBtcataKYtHtacttgtaca +aaDtYtgatagNRcYatgaStaaagactgtcWDtYaatVaNStagaaaWtaaaataDYtc +aMatSVBVaaaYagaaaattgtgcDagWSaStattttaatNcacgataNBtaattggaat +gcMgacattHaattctctaaMatactaBaaattacaHWgBNtNaaSattttaacHtgtag +tBtcRtttSaNNaYaMaDtatDtagaKggYgcaaSttgctactDcNRtWgtttaVtggca +aactattgSgaagtattatgDgcgtgtcttagcNtRctKggtMaHgaDaaagtactgtcg +atttagatcagNggtaattaKaatgaaYaaHaattggttVaaMggatactctaBgtYHMc +ttccVcaaWtgttHHRgagttKaaagaBtaRtaaWaggttctatRatSgtatcYtaWcat +gtaBtcaatctaatRgaYYtWtccattataBacttWtcctaHaaaaggttgacgtRattK +gaagcattSBtttctaNcSctSStNtYtWaWtgtagtcttgtctttaagNKgaagacgDa +RgtNaBaVDgaattggaYtaccSVYKctSKKcatagttgSttatcStactcaatSMataH +caKgatWVYtNacagtttBtRagYHaagtaNaaVVDgatattMaagattagcatcctaMa +aMctgNtMcSaRcgctHMttaattDtttYttcgataaagtMtaagttaWaaDcaatccKg +tgMMcatBgtRtaHBcttgtBaBggcaDcgaWttgggtaDaggtgatRtYaMWDttatcN +tVcttRaKagctRgtgcNaatctgattatagattagtatatgaataDNatcYaggKRaca +atcaHcaagttagtKgRatRgttaagaaaatacVctaaaagtgtaagKVgcttSWaaHat +agHctagtDgDtSaVtgatcatttaNKgKHataKBctatatWaNgtttgcRaVNttaDgt +cttagHYKatYaVaBtaatgaBattaYcNtgcaBtHaacttVtccatDagVaaaYgWtND +BgacagVgctcaRtaHaaacttttacaaggaSRaaatagaagaatacccVaHatcBRtct +tttaaDMHWtHgacMtctcaagKDttctgYctctcNagaMgcgaaDWatMcMatatttDc +tttactaVSctagttcaRKWgtttKRaVaaKtacaacaKttatttttggcctataaDgtc +BctBDgcYYaatNactcaaRgaRWcgattgVNcWaatctgKagDMgctatKttRatcatt +MaagtctaRaVaattKctgaKtatccgaaRatcHMaaaaaagattccacgtacgaDStat +atctcataggtacgcgatgtgaaggtHYtatWagKVKgaMDcaatttWccttgKgagtct +agatgaatgVRcctaMttgtaRaaYtRtaacWgaaaMttatcatNcgttactaaggtDaa +ggcagtRctcatcaatggYagccagcgaatatagtgttWtaccaRctagatttDtaaatR +cDKtccHtBWgttctWaagccYBSgtggaaagHNttHtctaaattaBatggaDMgaBgat +atcaatactcMtaaKtcYccgatDaYgHDBaagBattWattgatttttaagaRaaggatg +gYggaKttaKtBVBcttaWcttBtacctYaNYttgctgtBaaMtWtcWaagtaaggWcgM +DaaNtccWMWtatcMVgaSaRctaKtBgKWDacDgaaaaNgttcaaaaataMcttaWtat +gNaVaaRataWtgKctRatataagtgttgacgaKgaNgtaHattaaRagSgattctatgt +YtcaattagBYBatccYtgtNacHagHtacVcVacaacaccgNgBtataYaatWHSttat +tgctDacttgtgHgHcMcHacagctRSDtgattaggaDHtYagatggagWtaMatcRccc +acRaaaYagcagatgatacatatttVBBcaaMtctctaWgaNtttcctaVcttaYBDBct +RgSaagcNgatttcacgtcRDaVBttaRaggtaaggHcacttccgDBKgagaatttataa +aMaRattagcVgtttacaaagagaaaMtgDtttYttggcttataKaStacaVttBttctt +gBcVaataaagagtgagBgcgNcNattgaaacRcactDaaccaatWMtaaHtBgaaacaa +ccctcMctcaaatctMWttggttttacttagcRtttacatRtccBttVcatgaaBacaYg +agHttatWDtcctSatRtYggHtNMttRgNtgcatcacgacagaHgtYaSaactgaaNWV +agtagttagaNgatctgcatWYaDacataHtaWttaatHaDgactYgttcaSVtttacct +aatttaDgRcagacaDtgcYVttaagaSSKBYtgHtDtNtcgtcWttDtgtcNtgacKag +cactccDMacDNcccctWataRKcaaatttctRVaacagcaMtataaattWBctttgKgV +catttaVgtDgtatHtgtaSctagtatagcBtBtgtatgtcgcMcgagttctacgaaBgW +ccgaWatgcaRtWtaagYttaNtcWaHtgattYDatWRgRWagtRcHggNatNttWaaac +aSgcaatMatgacNgggaSatgatttcBHcctaaggWactacagaaaagctMcaaagaYt +HVgtaaHKgKattVaWtttcctaWgaKattatgMaattBgaaagtgaSaaaWtSNBtttY +ataVgNatgaSgcBaaccatattcctctagRtattatctttctMtgaRtctcYgaatDtR +cHgcRVtWtaacDtcacYatRcttNgcgaDtVctWtacHtatatgtatKaaggtaNcata +KRaataacacDctcctWgtSaWcatcDgatatBtaatHSNBtcaataaStHtacttaYaD +aMtaagMtgNaaaaNccccgYWHaatgcBcttaBcgtMBKggccaVgacaWgaaaaaVYc +RKctMgcaccWctcSacttcVtacgaagtYtcctttttaYgttattaataactSttRggt +cVgagWRStatKataYcaatNMtacttcgcttVBaYRaKttaaYatacagctBgagcttc +HcaatBaaaVcgctcacaMgttaHaggctaDtSgatattggggBgRMagtaattggattg +YYHtVtcttSRYaacttataBtNKgatVaWSDWacatVcttgttgaagScaDaSttcact +aattagatKttaMcHtMgKccaYatKataMcKNgattgtYtaaRHHcaWagctgtgcYat +MHaatRDgtgttYctatNKtSDtaKgcBttgagtKtacatgaaggcgMatDaWtcBatag +taaaatNYtSVgVatttcaNgRtaRaaNBttggaatVgaaaaagaaggtgNtttVBgcct +tgtgaBtgMgtaaacBgtactWgtaacctatatggaSYattYtVgtttaagccaRtatRM +cgWMgDVSNgataatBRccNagagStHttBgctaBagatattaacaagaggttttcDaRa +gtcDgtHttcataagaacaKBttaBgactaRatgaaDYHttgVagcMcBDgYactWgSga +cBataMMcttSaRHgcagKcgaaYaDgttcataYKcttcMWttattaaBacDcttDtttB +catVggttVHtgtMgKcgaaVgtcgMaaHHYBMaHtaaKaDttaNgNtttttaggMcWtt +NaaaDaaaaactRgaatagSVHtaataagttStccaatcHataatacMcattHtacaatt +tctgatggacatatgcaaacaKBatgcagacagVcctccgcaacNatcMaHtcMtaSctg +taYgtStcBtcatDacRggttRgagaaHatVcttYWgaDtatgYcaBKgtSWVYtttctW +ttHtctaYttttaBtcataaNgtBRaNcgttKgtgVKgggVtWatcWagttSttttttaM +aRWtccgttttattaHatttBVtataSctRWtgcMacaattaStBcacggaatRatactV +gaagMaaagWacaMgctaacaHctHtaatacacgaYagtcttKagcDttaKBHccgtaHa +acaKVtcMKcaataaaNaggttSaatcatgaNaaBtacggBcaagatcRgttttHaNgtK +ctYatBHHtaaaDNHtaVtVagttVacKtcYgcattcatacaaagtaacKaKKtaaNtNa +taaNaaSaBtagaattctgacacNtaHtataBDttBctataatagYSctgtaHcgccgaM +BaggttaMHtKgttactaaHaacgDatataaagcaWtgaMtttgVatcKaattcgHVNat +NgDaaYtataHacaaacaagagtatatDStgcNgcRtaaWVVaDStNgtcaaacgDttaa +ggNttWcaVNaccctgaaaMcagVYVaMtBgtatacSacgSgNtaaaDtRaBSaWcNacg +YaggtcaYtattagVStaccgatgSStMattctWtattHtHaDtatgYaatattgtttta +NggttVatcttRcgaNtHaVaStgaagactcacaaatcactgataaKBtNHtttctWWta +ttgactacNtaWatataaaBaatBttgggtatYtttYtgttttVttgagtcVaMVgaatN +taaNgKMaacgtaatattKWggcagtgRttgtgacactaaYacactggaaKaWYRgcatg +cgttctBcttggtVaaWgtttHagtcaatctcggaNWtaatBNcaMVKStaNcMtgatat +aatDYMctttcgcatgcYtHtVNgStggagcBtggMgccctgtgNtVatactgcctcHca +taDBtaStgNcagaYttaMtcaYtgtagatDaagaHaaaRcRataattcaDtcaDgttgt +atRaaaaYaRgtttDBgDcgaagcNttgcVttcacttaMgtMWaYaattcggaDcgaVtY +attaBYaaaattaHVttttWaacDttaRaSWactcBgaRctacaVStBaaatRgaacMSa +agaatagYtNctcaatagctNttaVtgctgtttgYcttaatgtgMaStactgDBagVSgg +tSKMYttDatgtMaaSaVtccSRMgaaaactHaatWWtcatttctDgcMcggVtgtRtca +tctttNatcaatatYaKaaaatKWtDDDaaactaagtacRHtcKttacaataggttWctt +ataSaYctgctVtaaVggatcctaHVttgWtgHtWttaDHaNgaccctatatgcWtNtta +cctaYtttDWtttaggHNgccatattacKggattVatatcRcggRWMtgcaVRaaHgtaa +taattttaggtctcDccaatatgSaaaagatDtaaVtYgNaHBtcaYttaaaaacagata +taaagttaaaDWccMHMattggtaaagtccgaKtatDKaVHaBagaBatactataVttDt +tDaMagctctaaDSggtttgaDacacVatcttNtgatKtVaBStatgNtgDKYcaatcat +aWtcNatYccgRtcgBHacaBaatagaVtagcttgaKagcgHtttDNtgaagMttStttt +gDDKRWtagtaBgtgagtgBcaDtWtaHcctatHatttgttWgagcggDtgtRDRcaaat +agcacacRtDgtgVaWtaattRacVataBWacSYWVctgYtWDaVtaKataaacttKaaa +MVHaaaaKNtaaacttgVataaaatMaaatMaagtatcaaRtatSYRtBtaataattgtt +tgaWtaNNtctcaatNaataaaaaaattgaaaattattgtgttaaYatccccHtaNcatt +cacttttaMgVDtaDMtcaWSgYWcSYtSgaatHtgctagaVattaBtaaaYgatattcg +aaBtgaaDacacatRaagcgggagggDMtatDttaatttggaKSNtactRMttactgtBg +gcgtcatNttctattaVacgttccKtVttMacttWtctaYcacgtaVtaaRgKcttggat +SYatattttgttacaaMgtgagagaSatattWcagDttggNtNaaYtaggaaKtYHcttg +KattWagNgtaagHHVatYatcattaaaaaYtHgttcaaaataattatBgcaKWKtagaa +tagtatBagaaMtattMagaMtHcWgYcacgttagtgtDNggctatNatRcYYHtaacMa +SStattRagRcgataaaatWNNatgaaatttVtKcRtKtDtaaMcctccaDRcaHtBSWc +YtaKttcacaaMaataaMaactccgSgtYattDtaWctagatBtaatSgatgatHKgttg +caaaaagaScHtgaaHRDatSagatcBcggcatcatYVaatgMaatStgNgWaaaaMttg +cYaaagttSHaYgaaatHattBgtaaMRagSaSacBaagtttttcatgttaaYcagYtgK +tYctaStcaagcgtaVattaNatWtHgtHKNDtcNaKaVaStSacaaStttagaaataat +gcDSatgtaKtgMMtcaaagtNattacMYgtgctNgVcaaNcDtaaaVtYggtaaaactg +caagaWNcaaacctDSaaSgVaKtctcatataMtggBtaRttKtagRcctgttaHgWRaa +ttgDaaatttHtaccagctcagaccKaaBctaagtatWtaVagBgtttatgaHaaggatt +StaactWacKDVtMHccgtacaMWYctDtagatttRctaccRagtWcWgaaaaMcagttc +tgacSctaaaactgaatcacaNcaMWtWccYgtttNaatttggttaaNtggttSattttc +aacgYVccMtcgaactBtatcYttcYDVMttcgattaKWtatttagcaatatcagWatgc +RVaatgRtacWaVVBttggatRtaNgRagttDYataacDVBcaaactttgtttgaccata +gHMtRctaWcgacagtgcVcaaVgRgtaagtRaaaattSBKacBaatcagaatgtHattc +aVRtatVSSaKatNataWRVaaagMaacataDgataWHatcNYcMtatttggaSatttcH +cgacaYcaKaaatattacHcSaBVatHacactaMDataaaggcacaacaSacctgtaaRg +tcccaaaatWtDtagtcaagNtttgatDacDgcagaDcWgatDaaKagctDWtttatatW +gDcaaaWttStDtKtatSagVgaaKtaacgaccgMgaSaatRRcagYtgttNDggcHSca +aYDWtcaacgtaHgaStKtgMtRtaatccagtDaaacHgtacaaccHtagataNaattat +cVtgaKaaNaaaaaaaagttgMgtcRaNaacagtaKcaBgtttgaMDgDMacttattatg +aDgagcgtcacaaRaagtYaggMtaaactagaacagVaMWataggtatHagtttaaHtca +gtaaatgRgcatgRctgaMttBaaataagWVtcHctgtgtYaaaaVtKtaSaaBatMttt +gttatattattcaaBYctBWtggatBtgaggDagtgcacVataRBctaBaaaataatttt +tNggtccgtVaaaaataaattBHaatBaagaHgttaagcctaatcaaatgaYtKaatYta +aggtMgaRggtWgggNactaacgaRaaattSttWtaataaVtHgtacttNtaagHaSacg +WggaYggNStcctgacgDcgHggtttHggtNtMtttDatNDgtgacgtatacgatKatat +aaacaattSaaagcagatKtttSagcaaMttttgaKtMtagtcRacctKSttBttaatMt +gcgttacaaagaVaataattcaSaaWcBVacYKtacaNBaaKRtRtcgWtWBaRKVtYWW +WgattgBctaaatKaattaYtMtSBMBHDtBtaggDtcNctWYagtgSaaBaVtcttNgt +cgttHtgtMtctatKtatVggKaSaagtttattttatgtactactHtHttSMactatHca +agaattVataaaMKNtaMccgtgatDaHcaacttRataacaNgaatcSBtatgacBcctc +gggtaatWaaWtacacaattctRVgattctatgtgtatHagatagggacVaattttDtNa +WKagtatatHtagacgaggtatgtcagtgagHccccaatNataKMBaHtcWgctagtgHa +atBatSataDatatcacccaagattttcSatKgatWtgaagtcBMataaHaaMaattatg +cttWWtttcgVKYNBattggtacttcaaMaVNcctcHatcgctVcttKatgtctctBMgg +acatcaggacSgaKttgagtctKVYaaagtaaSgaaaHaWactgRattaaBttVaHtgga +ttagRWtaaDaaatgatttSMBWMaDactScgRYtgaVagNctgtSBataKacStHRatc +tVgBKaggccaRctaacttcYKtcaDcttgaaacBBataatacYMgWgctgtacttttat +gaSaaatYcccgattattRStccaaaBagaacaaaVtttgcttatagaaacacScccSaN +taaaaBgtaaggcDgtSttRatMYSWatcgtaacgtStBagttaVaaaScccSggaMDBS +gcaaKaggatatacgtatgcWactccgVctNttMaYtaaatKaaatgKStaaaHaKatat +gBtcctatgtVaBggaatBcgcaatgagtatHcYagctDgtWaaccagtatWWtaRtKag +atagtgKatatgaaaggcaWgtNKaaagataWaatHaaaaaKMaaatttBtatHtctNac +tKtBVVagtatcacgtMgtgttaKtaatcgaaMHtYKNcMaatgcaSaaDBaaaaagaWa +DtWMgaacatttDcatttaBaBtDttaaSMtcagcttttRWWaataattcNctactWaat +NaBaattaagaaacttYRHaccatatKtaKcNVgttYagttBtaaaaVtctcgVctagct +cgSVatatagVtMcaaHRctaHStttNtcattRaatgtaRtgttaatYtaagcattgaat +ttaKtctaKKgaaggtcgMctttcWaagcgWaKcttcYttgtgaRaagMtDatgWgYaat +aKaatSWScatKBtYgtaagagaVcacgctHStaacaSgBtgtaNRYaaWtWcKgaccDt +gaWtgagMaYgVVgBaRacYtcKgatcagttgtaKcgttgagNaStctggaatVtactaS +NtaaagtaatcaattaaVaaDattHDBaHKDHctVggcaaacccKMaatVtgttacBcct +StgBgMtScgaaHcatgctMtStaVttttcDaNagtDVaatYcggaDaYtaactaNgtcc +aattSacaaaaRgtagaaKgtcRSNtgatBacccttMtactatKgtaaRMagataMatgV +tVKagaRagtcagMgMaatRHNttagaagaatgggaatcHtttttSgtNgYatgtgcYta +atgDctMaaaMccVScgcRgKNaaagtaMtacaKaMNaBatagBttttcttttYatataN +aWcagatttgMtgaaacaBYtHaaatgtaDactatttNatttKttSattgBatSRtgKHt +tacgattgcggtaaaaacHHtaNgMcgHaVDtgtagaagatBaaagDttaacSatttaat +ttaccagatataattggVgaRctRtcgccVatRNtDgcagBcVaHtBaatDttatgKRKa +gataaRgcagtaKgagttatatcaMSagttccRcttaaatgatcttataaacaaatttcc +cttaBaWtagtagttMaacMaKaaaagHatYKactttRatgtctcgattBcSagaDKttt +HtBaccttNttVttVVtggttacgtaaBMRgatcgtctacaaNBtaVggttYaaggattc +caNgRgtagBtgtaBacaagtataaatBaaatKRtaMtKHgatcgYggDSgKRaSttHSt +catgtatatWacacRacHcatYtttaacYatatgtgttNtgcSagDHgataYttNattat +cVattcaaYttggtaRHtWtcgaBacgtttaBaccaBaatgtcgcNagaNtKtaDtgDta +tgDaBtcKgtBgatacNaccDDatttYtKggMtYNtaactgVacattaaHgMttatcgtH +MNtataBtKSgccaVttaBcttattcBaagtgaWtaRtcctDVRatgaattgatatgaWg +ccacDaatKaHtttacatNttaWNWgtacaggctacttBaYaaatatacaaaatttcgNH +gMgttHctcKYcttgMtaacBaDVtaatttacagaRttttttagcKagtKactatMRtgt +DtaattccRcaaKSttagttttBtctatagaKaVttttgcNagtKVccttagRgWaNaKW +ttataDgcgaatgMKatgatRcYtctgVagaccgcgVgactagaWaaHNtcRNRKaatac +tcYaNtSDKtcVVggNgDagtttaaKRgttaDcgtNNgtcaYttggtttYtatgtaaagg +attttagatattKMcatgYaaatcaVactcagagtRYtgtaactatagtBaDtVaWatDa +tctataaaSgggtactaYaKKWagaaaaataaattatagRcaaaVataVagatatgtagg +cWagacRWattctgacgcDtaBcYattgtaDggMatgagcgagaggctaaatVtctcagR +agDtSgKNcgtVcStacatttagNtgatSNgatcYVtHattHtBgMacRaattaHBacRc +NaaccctVaaYaattcVccatacKcttSagtctgKMNagRaNcatNgcgHattStSKYRg +gtcagtcaccattttagtMaccctggVattHaatVagaaMaattaVacatacacaaatta +attacgtKtagaaaMgatWgWccatYtagacKatctKatMcggYcgcatgHRtcStVtaa +tHgSaaaVagtgaatgtgYtattaYcRagatgatcataacacSgaYaactMKttatRcga +ataaMSatacNgaMatttcggccacgaYYMcaKattRagDtRtatMVBtaattWtMHgNa +WDgStaaSNggStcBcVYtaYagaHtacagttccMcgtYtYttcattgSWcttagttcgt +HtgVRYgaMacttBtatcaactaaaaVtDgataaDgtatcatYDttaStgccBacctaaB +agttgRtaSBtaaaagWgcacBggttagcMaYatttBgtaggtRBaSagttcacgtaDaY +aaaacDSaKattctgtSatatgtatggVBcctctgtgaaHDKgttaRttttBMHgRMgHa +gtagMgacgaagttaatattgRtHtHttatYaaagcagatgtgattagtggcactactVa +ttagatctctgtttatcattYttgatHcHttagStgatgactctDaaatcagtgttgttt +ttcYaaagtatatcYcaSaacaVttcgWtatKaaaHWtRgtttaKacttctgaaNaYacc +tNtcStatttaaagttKgtgatcctBcaBtctttaaaKagttgDtWctDtgtgctataKa +gtaNHatctagYgatcMgtggYaagactgacacttaRaaccHgttcaYtagWtggtgBcS +tacaMcMHataaaNagatactccaggagttaatcatRttttgaKNgSgcaggtgttRaYc +aaataBtaDtatHgBtatacKaataKtaggaaatatgcataaHgaKttttatMaaaNgMa +tYattgaatNtatVaggtKctttHattcatttatYtattagtataYtttagYcattagaa +ataHtaaccttactcatYttHMRagttctDagNSVgcgVaNNattctVcaaVagaattta +agaggttttacRagtagtaaaBaBaaMtaScKgVaRcNtctgtataagtatVgtDgHaYt +tcHYttaagatRgtgaattctYaaaattRtcWtacDDaRatcaKtaSacaagctaNttRY +agMSDKtWgWaYNgaaaatatNtaatatHMtMWRaRacaaaatgctgctacNKaKtagtt +gVatDaVccatSDtgaSggcgWatccBgaaVtgtaWttagatVaBWtacgWtaYattaaa +tMctDgDaaKatttgaaatgctWctttaHtggHaBBSRVBWtgattgagatccNcaaaHt +>THREE Homo sapiens frequency +gcactagtattgtcgggatcccattaacaggctcaaccacgagctcacgcgaggacatgt +agtccgtatctttaacgaagcgacagcgacagaactcccatggataaccaattataaggc +ccgtaatcctctagacatcgtttaccaataaatccgctttctccgtaatcatgttgaata +ccccagagtagtccagatgataaccgatgaaacacaagtctttctcaatgcacttacggt +gaacttattaccgccaacgtagctcatcaaggttgcgacatctagttgtgtgtttgcgac +gagcccagcgaacttcatcaactttcgtatattcaacgccttgtaattttactttaagac +gcctggtgatgtagattcttagataatcagtttgttatcggctgtactttaccataattt +cacaggtttcaggtcaagaagattatagctgtatatacagttccatgctcggtgcacaga +aacgtgatcggataataatcaatcgcttatgtcgtctttaggcgtatccaatacatgccc +cgataccgcagtgtatttcgacatgtaggtataccgtcgcatttgagctcgagtcaggac +gtcagctagattagattccttaatagaatataccgacctctagtccgaactaaactatag +ataacgccaacttcaggttaattgtctagtcgtctgtttgcagatgggattcttagatga +gtgagtatcggccatattggttcgagcactttagtttttgatgcataggatatgcaatgt +atagctgaaagtactttatctgtttcaaactcacattgattaaaccggtaaacctttaaa +gactacaagaaaatattcagtgagggcaattttgtcaatcacaatcttccagctagagat +acttcacaatttgtcttgaggctacgcaacattagacggattttcgcgttttattgaaat +aatcgaggggcccaagagtatccatagttcattttgtaagatttctttacaggcttatta +cagcttcttcagactcctacatgcttacgagttatatgctagcatgtgaacaatagatta +atatacaggaaaacgtacattgagagagatgaccctacacagcgcaaccgttgagtactt +tcattaaagggtaacgctctcgagacagcatccttaagatggccttattgtcaaatcatt +tgcagaagtacgcaagatccctaaccaacgtagaagaatccctacaaacacatgagacgc +ggtgaaaatagacagggtgttagtattcaatcttcggagtatcaatttcgccaatcttgg +tgagaaagcataccctttcttcagagaaagaagatcaatcataacactatctttaacgag +gtacgcacgcgcatcattacctgcctccatggatctttaggatagcggaaagtattggca +gcgtattgtgatttcgttcctactttatcaatttcacattcatatacatgtcttttatca +aaatcgccaataagataggatgagctatattagatgctagtagagttcgcgccaacatca +tcgataggaatactcaggacagcgtgataggacttttcaatccctaatactctctataat +tataactctctcttaagtttggaggcagtaacgcgctctatataatcagtttgctgcacc +attcttcagcctctgatacatacaaataaattccacagcagtaagagggtttaattgaga +catcttgggaacttaggattttactctaacatcaccgaaacgattattggataccgtacc +taaacgaactttctcaaggcagtaatataggacatccgcaataacacaaatgctgcctcc +ccaggagttatgtcttcctggaggctatatcttacacccactcactataggcaaactaaa +gtttaaatgttgattgtctaaaaaaaagatagataagagttggccggcgtagcacatgcg +aaagtgaatcgtaagctataattctctggacttgaagttctgtcctgttcctctgcaaga +aacaaacttcctttaaagctatttacgacgcacatctcagcaagttataaacatgttgga +agtttctagtcggaattcccaaagaacggatctatctaatgcattcctacatttttcctg +tctgccgatggtgccatcctattcaaagaatttcttaaaagtagattaaatgggactttt +aacaatgagtaaccttacgcctctaagggttcctcgagtgccatacaccagtcaggtccg +agccacatacacggagaacattctaacatagcattctcaactcgatcatttgcaggttac +ttctttcctatcctagtgctaaaaatcatacttgcaatcccatagcacggattaagaacc +taagaaacaattcagtaaaacatgttcgaattcttggtatgggaacatcattgcagctat +ggtctaacgcattaatgtttgggtacatcttccatcatataaacaggaagagtctgacga +cagggagtgcttgcgatcatgtctatcattgtgaaatcaaattgtagctcacatgtcgtc +tatgagagcgtgtatccgataagatttagaaaaatagaagtcgtataagatctcactgaa +cttttgaatgaatgtgaagcatatatgatctgctttaataaaactttatccataggatac +gtttccaaatcaattcaataattattagtcaaaatagataaggatgaacaacctgaaggc +cgatcggacgtagaaagtggtcccatcactttgagttgatattgttgaaccacacgttat +tatggttttcaaacagtctcaggatattgtatatacagataatccgataccagttgtctg +acgcccctcttacgtaccccaccctttgtgacgtttaaagcagttgttcagtattttaaa +ctaggcggcaactaatttggaaagaagcacagtggatatgtctaaattcttgttattcag +gcctgaatttaatacaccgcatagttaacttcgcggtagagttgttcatcatgcctcctc +taagctaccacttctatgatacaccaatagttgttctacggaatctgataattggccaag +tcataaacttccgctgcgttcaacccccttgctcgaatatccaactcgaaaagacagcct +tttggtgtccggaacaaatcagttacttcttttctgatgttaattctctgtggtcagata +cagaccaaaaactccgcggatttaccatcctccaagaacaaatttgcatcaacatagcat +tttggctacatattctaagtctcaatagtttaggttttcaactacattatcccaacatta +ggattggaggaataatagctgggtaagtccccttgcgtctacaatcgactattttttatg +aatatgcttctgccgcacctatggttattaaaaaagtcatgactttgaagaaccctgaaa +agatagatgaatcaggtgtaatggcagcagccaaagagcatataattagcaacactctaa +gaacattatagatatgatgatagcgatcgtcatgatgttatccggtcacaatagtagctt +catcagctaattcgttttgccagtggtgacttgcgctggaagaatcgttatacggtccct +tccctcttgatacggtgggggcttattcaaccgcgtggattgggttgtcatacttgcatt +aaacgatgtaaaccatctagtagtcaactatactaaatcacaaaatagtgatcaatacat +acccgcttcatggttttaaccatttaattgattaaagatattccgctaagaaccattatc +tacctaaactgatcgccgtatcctagtagtttgaaatttgatgtaccgtaatgatcaacg +aagtaaaacgttatattgtatgtagaataataggtcttggagctaaatgatgtgattggt +agtgaagacttacccttacaactttaccggtttctcggaagaatatactagagaatcaat +gcatgggctacataagcactttagtctaatgagataaaaaatacacgagtcttccatcat +gaattttttgtcgaaaaactcgaacctggtaatttaaaccatatatctttatgtcgtcaa +taactctcatatgttttatataacttcccaatcacgacttgtaactgcttgttcgactga +gctgtttgagctatgaggccgggatccggttgagctacatctatttgctacaagaaaaat +gaaagcacatttgttgggagttctggctacactcatagagaaataagtggcccgagtggg +tgcggcctgcctccatattcaagtgtatcttaaaccaagtggttccaacgctcgcgctaa +agaattaaagcctttatttcctccacggagtagcccgtaatccggttcgaaagagaccat +tgaagttaattttcatatccagtgaagtttaggcacaagcatgtgttctgccacatgcct +caaagcgctcttcaaccaagatatgattcatcctaacttcgatgaatgcgtctgtaacat +aaatatagaaggaatgattcggcgagttaattttcgccttctccaacatggcatccctac +gttcgttataaggaccatacatgtaggttttaaaggtttgcggttaatcgatatttacat +catagaaattctatagtcaaatttacaagactctagatactcactcgttgcagccggcta +ggaagcgctttgtaccttacttcccttttcgttgcgtaatatgaatttcatatagtaagt +tcaaggcactcatacctccgtgaagagggtagatagactattaaagttgtttaatagtac +gtattgatggaaatgacccgtaggagatttaccactcaatccacaagattcgctgctgtg +cattatcaaaacagtgcatgtcgaaacatgggttgggtccttcaaacacgaatccaggta +gagatacctttgcaatttttcgatgaaggcgaccgagataaatgagctataacactgtat +gtcttttgattgctataaaacacagaaacggatattaatttaggccgtaaccaacatctg +ttatttgacatagaacagatggtcctttacagcgtattccggccttaatattgaggtcca +gtgtattgtcctcctttaaagaagttgattgtaactgacttaaataagacatgtcaccca +ttcactgggttgcaactgctggccctttttgtccatcgcacgctaatgtgataacagtac +cgccctcacacctgcgtttaaaagacataaatgtcgctatgaaggttattcattaatttt +agctgttttcttagaaaaggtaaatttaaaattgaaaaggctagaaaactaaagttacga +caaatgtgtttgtcaagtaggcgggcatcattgagattgtaagaaataaagccataacca +gccccggaatagaaaatgttaaggaaaggcgatcttctttgaattcttattgtcaagtgc +agtcatacgttcttatcagaggacattgcaataaaatctaacaccctcccttgtgtggtt +gggccatttgtacttcgaagcgtccaccatgtgcagaggataacggaatgtggttccgtc +ccataaacgatcattctcgcccacttagtggcgcggtaaatcgctctcatagaggtaact +ggcctgtaatgtccaatgttaggctaccttctccaactttagtacaacgaataatgtccg +attaacaaggagtcaatttgtcatgaccagttcattcaggtacttgtatctatacggacg +cgttccagagtagtatttgaaattttgaggttctactgataagtttagctatcgctgtat +gtctgaataagaatttaatgtttatcttcgataaataacaattaacaactcctaggtgat +acactgtgaagtctgctgttccccaaattacatatgctattttgttcacataccatgaag +ttaagctaagtgctctataatggcataaacggttatcaaactagctcgaatttcttttat +tacgccggaagcggattaactgctgtagatcaaacacgttaggatagtgtcgttttcata +tatatctaaattcggtctaacatgcattacccatgcttgataacgtagcacttcgcagtc +taattatgtaatgtccgtttaaccaaactttaaaaaagtttatctatcaccagtgatgcc +tcatcgtgactacccggatctttagcctttagggtctaaacagaactaatattactacgt +gtcatactccggagcttaaccaggtgaaacttatttgttaaccaaatttagtgacagggt +agaaatacgtatcaaattaacccagcaatacaataagcatgaaaataattgtaatcgggt +ttgggccggaatcccgcttggcgaaaacttaatgacatagtgtgatgcattttgcactgg +attgagccacaaactcaactagcattatgctcaatatttggccagtgttctacggtttga +aatttataaaggccgcgcaaaagtcttgtagttacaaacgcataaatctcgaacgtaata +ggtttaattagaacatccgtaggatttctgtttatagtagatttatactaaatgttctga +ttagattctgacggccttacccatacaattaataaagacgaatatattagttatagttta +ctatccaaataaattaagcgaatcgaaataaactgtcacgatactgggcagttatcaact +tatcacttatacagttcggacactctatattggtctgtgagtactctatcaaactaactc +ataagttaactgcgcttccattaaatttcaatacgttcttgtgctgtgtacaaacctata +atcgaataaatgacacatatggagatgcataataaaaaaaacggctccatatttctcgtt +aatcgggcattcttaaggaggagcatctcaccaaaaataacgttcctgataagtcttaac +tattagaccgtcttcgggaatgaacgaaacctcaagctagcatggtatagttcttgatag +cgcgtaaattctgataatactgggcggacagctggaaattagttgccagtgcacctacgc +aaatagtttacataaatcaacgggctccgaacgtaaatacaaagggttagttacatcgca +acaagatgaaaagcatgtatgtctaccgtcatccgtccctaacaaacataaaggtggtga +agaatctcgtaggtcaactataactccatccttgaagcaactactccgcgtccgtgtgcg +tagttcgcaacgagaacactactgaaaaaagctaaacaactctcggtacaaatgcggctt +gtgtcgataaagttggtggtagtgcacggaataacataacaaggaatattatttattcaa +attttttgtgactgttatttgttttctgcctagaatgtaaggatgtgttttttgtgacct +gatagttacgcttatttcaggtccacggtgcgtgagagtgtgtcctataacggcagggga +gcgaagtagtgtcctttagactattcaaggtagaattttgataacgctctataaaaggta +gaaaatcatgattgagcaataagaccccaacttatcaaaaaaggagttctcgacagcgcg +tgtacagtccctataacggctgtatttcctgtgtcacaacaccctcccatcgcactcaaa +atgtagatttatgatcagacgctaacttgttcttagagaaaaatacacgggatactctgt +gcaacgatttcattaataaggtgcagcttgggacttttttggccgtaggctttattaaca +ttcacagtaggtagcgagacttcctatgaaccaatcatgccacgcgttttaacgtttcaa +atataagctaggaagcgtttgccaggacttctataatgcaccgttttttttagtacttcc +ttactagccttagtttatgttagagtctttccaattacaaaggattgaatagccaaaatt +tctacaattctcagcgaacgccagcttaatctaaacacgagcttcaaatattctacatat +cggcaggagtcaatatataaatatgaaaatcgtaccatcctcgtacttttagaccaaacg +tcttcggataattaaatcctttttcaattaccacagtacgtgcattagaactactgctat +gaaagtaaaccttgaaatatagtcctcaagagcgtatccaagtacattgcacgtgtatac +agtcgtataaacgagttgatgttctgacgctagagcttaccattcgttaaacagataact +aaaatttaatggctgagtgacttagtgttttcgacaaacgtcgcggatgtagactattgt +ttataagcaatttttaaaaacatatgttcaaaacggtatgggatatgtcgaattccacag +gggtttatgtaccatagaagtatgtataaggtactaaaggtttaaatctgtgatattcgg +ttcggtgaaaatcagactagtcacacttagtgtctgtaaattagattgggtgaaggtaag +cgatcccgaactctacaaggcatgggatgagattctaccgactccggataacactttacg +atcgcgcataactctagctcttagataagtttaacttgtcgatctcataaacagttcaaa +atctgcgatttattgtatcaaatccatcctctatcttctataatcatctgaaccgcgata +cggcactatgagccaagtgaagattgaatccaagaaagctataattggtttattttagtc +catttaaattaagtccggtataagtgctctgtacaatatgcagtctcatgggcatatacg +ttaactaccttttgatacttcgaattggtaaaatatcgactatcgatttgcagtaaaagg +tgtagagtccaattactctttcctgttacatacgatctcttagtttggacaactagccca +tgatggcgctcctctagcgcatgaacctactttataattacatctttatcgatgaatttt +tttagactgcggaggccttgagttttaacagggctgctaaatttcttaagcgattagacg +gtagcgtcgtacgctacttgcttggaacaggcaccgaaaatattgatctactattgcgtc +aactctattctgctaatagcgatggcaaatcacagaagccctcttagtgacaatagttgt +caactatatctaagtcgacctttactgtatcaacgatcacggagagaattaccgaatacg +aaacctcaggactaaaaaacggaaaggatttgtcgacggtaaatataatacttgttaagg +gtagcgacacaggtatactttgggtgtaaacgtggtgcttcccggaacgattttcagacc +agaaaattgttccggtaaccaggaaatctcgtctgcgttaattcgtgttagtaaacttga +tcttcagactccttcttttcgttgcagcgagacttaaattatatctgcgaaatagtgccc +cgtgcatacttcagatggtaggagataccatttggcccattgtgactttacgcgattaat +taaccgacatacatctgttcctgagctatgatcgtctgaataaattacggtctcctcttg +atacctaatggtttctggagacgtttctcatgttcaaatggatagcaggagatcgcttca +tcaagtttagctacgcagagcatcaaaatatgtatgggaaagtcgatttccaaaccagaa +gggataaagagaaataacggacttctccgtagattagcctgatattttgatgggaatcat +ggcggcacatacgtaagagttgcgtgaacgaatattttggacggcgggagacacatatcg +gccattcgttaaggtctctatattggacatcacaagcttagcagtatgagctactaacac +tcaagacattattgattttttcaagatatgtttcattcctctaccgctattcccatacgt +tcgattcgccgggtgagcgaaaccacgggactgaggttaagctaatcaataacaactcgt +tgcgatagagacctatgtatactagagagaattccccaacatttttacaaaaacaaagca +gactaaaatagatacagtccctccatacaattaggaccaacatgttattgccgatcctag +cacacacaccacaaactcagaacttctgtcttacctatgaaagggtctgcacttctgatt +gtacgtgtctaattagcattaatattaaaactaattaggataaactataggtacgagctt +tactataagtcactaggtgttttccgatcgaaaaacgggaccttcaagccttggtaagta +catttaggataaagaaaaaaaggaaggtacgtgactaatctgtctaaactgacaatagag +tagtacctacatgcttcatgtcaagtcttaatacgcaagcgctctcgttatactgctcaa +caaaactcataaagttggactccatcatttagaatcatagggaccaaaacatttatttgc +tactgtcactttgtaggtgttctattctgaattcctcatattgatacatgaatcggaata +cctgtggatcccttaggacgcacgtgctttctttacgtcagaatacatattgtcagaatc +gagaagttccatgcaattaagaattcgcctctttgaaaactcatatccccacatataggg +tccaccgttattcggaaacgatataataattattccagcgttgagcgtcccttaagagcg +cattttcgcttggcctttcttctacgactctacaacgcaagtggctgtgtggagtttacc +acagcgcagcaccccatagaactacctctgagagcgcgagatggtggcagtatgctctgc +agctagcgtttagaacgcgcccgcgcattaaccagtcatattaaaatggactgtcttaat +tgtcggcattaggagcaatattaactgatgagggtatcggtcgcagaagtaatgacggaa +atacgcctctagtccgcagagatacgattacagactcagatcccctaacaagcaaaacga +ttaaatcggaatcactccccctatgacatatttgaaatacacaagaaaccacgcaacatg +tcccgcattctcaaccgcgctttataagatgttgagtctgagaattagatgacctaactg +caagaatcatggcgagtttatctagtaggcaagtctgtaccctagggttcgaacgctgtg +acgtcgtgatcggtctaaggacttagatgataaccaagaactggtttaccgagtactttc +actattaggagtaattacatgcgttcaccgcggaatacgacgaaattttttcatatcttt +atgagcgagatcgtgtcgtctttgcattgcaacagtcgctaccagtaattgctgatcaat +tatagattcattatacagatgcttacttttctctattcaatactgtcatgagttgttttt +aaataagcaccagaattatgtcgcctagtataatcttgcttccacttgaatcaatgcgat +ggacagtattctactgattgcaaagtagtctatttcggcttagcagtacgcatgcctatt +tttttgcaggcacagaataatatgcaactaggattctcggcatccaattaacaggctaaa +acaccaccgaaagacaggtaatctacgaagttgatgtttactacagaaagcgaatgatat +cacttggagaacattttagatgcccccttttaatctagactgagtgtaccaatatatcac +cggtctaccgaatcagcttgaataaaccactctagtactcatgataaccgagcatacaca +tgtatttctcaatgcactgaaggtgaactgtttacaccataccttgcgaatcaacgtggc +gacttatacttctgtctttgagtacagcacaccctaatgaatctaagttagttgttgata +cgaattgtaatttgactggatctcgcctcctcatctagattcttagagaagatgtttctt +atagccggtactgtaactttattgatctggtttatggtaatcaacattttacctctattt +aaacgtccttgcgccgtgcactcaatcctgatcggtttagattcaagcgattatcgagtc +tggaggccgagaaaagaaatgcacagagtaagctctctattgcgacatctacgtagaaac +tcgcatttcagatcgagtaagcaactctcattgtgttgattcagtaatacaagattacct +acgcttctacgaaatatactatagatttagcctacgtcacctttagtgtcgagtcggagc +tttgaagatcggatgcggtgtggactgtgtataggcaattttgctgcgagctcgtgactt +ttggttgatgtcgatatcaatgggatacctcaaacgtctttatctctggataactcacat +tgagtataccggtaaaaatttattctattcatctaaatagtcagtgagggctagggtcgc +aatcacattaggccacatacacatacttaacatgttctattgacccgacccaactttagt +agcattgtagccgtttatgcaaatatgccaggcgccaaacactagccagagggcattttg +ttacatttatttaatcgattattacacagtcggaacacgcctacatgcgttcgacttatt +tgcgacatggtcaacaattcagtaatttaatccaaaacctaaagtcagagacatgacact +aaaatcacattaaggtcagttagtgaaggaatggctaaccagctagagaatgcatcatta +acaggcacttattgtcaaatattttccagatctaagcaacatcacgttaaaaagtacaac +aatcacttaaaacacatcagtccaggtgtaattagaaagccgcttagtaggcaagcgtag +gagtataaatgtagacaatagtcgggacttagcagacactggatgcagtcatagaagatc +ttgcataacacgttagggttagagctacgaacgcccatcattaactgcctaaagcgtgcg +tgagcttagcgctaacttttccaacacgtttgtgatttcgttcataatgtatcaatttca +cagtcatatacagggagtgtagaaaaatcgcaattaacatacgttgacctatttttgttc +agagttcagttagagcctaatgattcgagagcaataatcaggacagcctcataggaagtg +tcaatcacttagaagctatattattataaatcgctctttactgtcgtcgaaggaacgagc +gagagagaatcagttgcctgcaactggcttaacaatatgatacataaaaatattttcatc +accactaagacggtggaattcagacttattggcaacttaggatgggactattaaataacc +cataagatgttgggataaagttacgaaacgaaagggatatagcctgttagataggaaatc +cccaataaaacatagccggcctccacagcagtgatctattccgccacgcgatatctttat +accacgcaatataccaataataaaggttaaatgtggttgcgatttaaaaaagatacatat +cagttgcaccgcgtagcaaatccgtatgtgaagcgtaacctagaattatagcgtctgcaa +gttctctaagcttcctctgcaagatacaatatgactttttagcttttttactaccaaatc +tcagaatcttagaaacaggttggtacgtgctactcggaattcccaaagtaccctgctata +tatgccattccttcattggtccgggctcaccatggggccatcatagtaatagaaggtagt +aaaactagttgatttccgacttttaacaatcactatcctgacccagatatgggttccgac +tggcccttactccagtaagggcagacacacagacaacgagaacttgataactttgaattc +tcaaatcgatcattgcaacgtgacttatttactagcctactcctataattcatacgtcaa +atacatttcaacggaggaagataataagtaaatattcactaaataatggtcgaaggagtc +ctttgccaacataagtccacatatgcgctatagattttttcttggggttcatattcaata +agataaacagcaagagtatcacgtcagcgagtcattgagatcttggctagcattgtgata +gcatattctacctaaatggtagtctagcacagagtggataagatatcagttagatataga +caagtactataacagatctcgcttcgttggattgtatggctagctttgatgatatgattt +tataaaaattgatccagacctgacctggccaattatattcattttttatgagtaaaaata +gataaccatgaaaatactcaagccccttaggacgtacaaagtggtaacataaatttcagg +tgttattctgcaaccacacctgttttgggttttcaaaaaggctaagcagattggttttac +agataatccctgaacactggtatctcccaacgatgtcgttcccaacccttgctgaccttt +taagctctgctgaagttttgtaaactaggcggaaaatatgttcgatagatccactcgcct +gaggtagaaattcgtcttagtaacgcctctttggattacacagaatagtgtactgacacg +tacactgctgcagcagccatacgctaacattaaaattcgttgagtctacatttgttgtta +ttcggattatgttattgggaatagtatttttattcccctgcgtgaaaccacatggataga +ttagcctactcctaaagactcccttttggtctacggttcaattctcttactgagtttatg +ttcgtaattatatcggcgcagtgaatctcctaattatcaccggagttaccagacgccatg +aacttatggccagaaacattgcatgtggcctacataggattagtatcaagagtttacgtt +tgcaacgacatttgaccaacttgaccattcctgcttgtagaccgcgggaactcccctgca +cgcgactatagaagttggtggtggatgtggcttatgccgcaaatatggttttgaaaaaag +taatctattgcttgatacctgaattgagacatgtataagggctattgccagatgaaaaac +tgcatataaggtcaaacaatataagaacattatacataggatcttagcgttcctcaggat +ggtatacgctataaagtctagcttcagcagctaaggagttttgccagtgcggacttccgc +tggaagattaggtttaaccgccctgacatcttcataaggtcgggcctgattcaaacccct +ggagtgccgtctcatacttgaattaatcgatggaaaacttcttctagtctaatattatta +ttaacaaatgacggttcaataaataacaccgtaagggtgggaaactgttaagtgatgaat +cattttaacctatcatccattagctacagataatgataccccgatccgactagggggtaa +gtggttgttccgttaggataaaccatgtaaaacgttagagggtttgtagattaattggta +ttccagataaatgaggtcagggcgagtgatcaattacactgaaaaattgtcagcttgcgc +ggtagttgttaagacagtataaatgaaggggattcagaagcaagtttctcgattgactga +atttataaaccagtcgtcaatcatgatttttgtgtcgattaaagcctaaatggtaattta +aaccattgatatttatcgagtctataaatatctttggttgtatattacttcacaatcacc +aattctaaatgattcttccactgtgcgggtggagatatcaggacgggttaaggttgacct +acatcgttttgatacaacaaaaatcaaagcacatggctggggacttctcgatactatctt +tgagatagtacgggcaagagtgggtgacgcctccctacattttcaagtctatcggataac +ttctcggtaaaacgctcgcgatatagttttaaagcattgatttaatccacgcaggagcaa +gttttaccggtcgaatgagaaaattcaacgtaagtgtcatatccagtcatggttagccaa +aagcatgggttatccaaaaggaataaaacagctcttcaacaaagagatgaggcttcataa +cttcgatgaatgcgtatggttctgatatatagatcgatgcatgaggacactttattttag +ccggcgaattaatggaatccatacgttacttatttggacatgacttctaggtgtttttgc +tgtcccgtttagcgatatttacagattagtatttcgtttctcatagttaattgtatctag +atactaactcgttgaagacgcataccttgccatttgtacaggacttaactgttccgtgcg +taatttgaatttcttataggttcttcaaggcacgaatacctcactcatgaccgttcatac +tctagttaaggtcgggaatactacgtatgcagggaattgtaacctaggagatttacaact +ctttaaacaagagtcgctgaggtccaggatcaaaacactgaatctcctaacttcgggtgc +ctccgtaaatcacctagaaacctactcatacatttgcaattttgagatgtaggcgaaaga +gagaaatctgctttttaacggtatctcttgggattccttttaaaaacacataacgatagt +aatgtaccaagtaaccaaaagctgggatgtgtctgtgtactgatccgccgtgtcagagta +gtccgccatgaatattgacgtcaaggctagtgtcatcaggtattgatgttcattgtaaat +gaaggaatgaactaatgtcaccaagtaaagggggtgaaaatgctccccagggttctacag +acatagagatggtcagaacacgacccccctctcaacgcagtgtatttgaaatatatggac +atatctaccttattctgtaattttagatgtgttctgtgtataccgatattgataagtcaa +taggcttgattacgtatcttaagacaaatctgtttcgcaagtaggaccgcatctttcaga +ttgtttctttttatgccataacctgcccaggaattcaaaaggttatcgatacccgatatg +ctgtgaattattattctaatggccactcattcctgcttatatctggaattggcatgaata +tcttacaacctaaagtctggcgttgcgccagttctacttcgtaccggacaccatctccag +tcgttaaccgaaggtgggtacgtcacataaaagttcattagaccacactttgtgccgacg +tatatagatatattacacgtatagggaatgttttctcctaggtgacccgaccttctacta +aggttgtacatcgtataatggcccattaactacgaggaaagtggtattgacctggtaatg +cacgttcttcgatatataccgacgaggtaaagtctactattgcaaagtttgacgttatac +tgataagtttagatttccctggatcgcgcatgaacaatgtatgcgttatctgccatatat +aacatgttacaaatccttggggatactatcgctactatcatcggaccaaaattaaatagg +ctagtgtcttatcagaacatcatgtttaccgaactgatctattttccaatttaagctgat +attacgtccgcgtatttattttagttccccggatgacgattatctgagctacatcataca +agttagcatactcgccggtgcattgatttcttatttcgctatatcttcaagttcacaggc +ttcatatagttccaattagcagtataattaggttttgtaactttaaccatactttataaa +aggttatattgcacaactgatcaagcatccgctataacccgagctttaccagttagcggc +taataacaaataagatgacttcgtgtcatacgaccgtcatgatcatgctctaacttaggt +gggaaccaaatttaggcaatgggtagtaataagtataaaatgataccacatatactataa +caatgaaattatttgtaatccggtttgccaacgtatcccccttcgcgataaattaatgac +atagggtcatccatgtgccaatcgtgtgtgccaaaatctcaaattcaattatcatcaata +ttggccaagtgttataagcgttgaaagtgatataggccgccaaaaagtagtctacttaaa +aaccaatatttatcgttcgttattgctggtagtacaacatcacgagcatttctcttttga +gttgatttatactatatctgctgatgtgattatgtcccacttacccagaatattaagaaa +gtcctagattgtaggtatacttgactataaatataatttaagactatacaaataatctgg +ctacattatgccatcgtagaaactgataacgtagtaacgtcggacactagattttggtcg +gggagtaatctagcatactaacgaatttgttaaatccgctgaaagtatatgtcattacct +gcttggcctgtcttcaatacgtttagactattaaggactcatttcgagatccagtattaa +ttatacgcatccatatttatactgaagacggattgagttaggacgacaagctaaacaaat +attaagttaaggattagtattatattgtagaaactcgtcgggttggaacgattcatcatc +atagaatgcgttacttattcagagagacttaattcggttatgactggcagctcacctgga +aagtaggtgaaaggcaacagaagaatattgttgactgaattctacgggctacgaacgtaa +ttacaaagcggttcgtaaagagcataaagatcaatacaatggatctctacagtattacgt +aaataacatacataaacctggtgttgattcgactagctcatagattaatcattaattgaa +gctacgaagacgcggaagtctgcggagtgagcaaacagtaatcgactgataaatgcttat +aatatcgcgcttaaatgccgcatggtgtacattaacgtgggggtagtcaaaggaatatat +ttactaggaatattagttatgcaaatgttgtgtcaatgtgatgtgttttatccagacatt +ggatgcatggctgtgggggcacaggatacttaccattagttcacctacaagcggcgtgag +agggtctcagttttagccagcgcagagaagtacgggcctttagacgattaatgctagaat +tgtcataaacctcgtgaaaagctagttaataatcatggtgctagaagaacacaacttttc +tataaaccagttctcgactgacagtcgtaactcactatatcgccgctttgtactgtcgca +aaaaaacctcacatagaaagaaaaatctactgggtgcatcagtagagatcgtgttctgag +agataaatacaccggatacgatctgcatcgagttcatgtattaggtcaagcttgggactg +ttgtgccagtagcattttttaacagtcaaagtagggtgagacacgtcatatcataatata +tgccatcgaggtttaaagtttatatgataagctagcatgcgttgcaatcgtattcttgaa +tgctccgtggtttgtactaattcctttatagactgagtgtatcgtacactcggtacaatt +acaaaggatggaagagcaaataggtcttcaattataacagtaccccaccttaatctaaaa +accagcttcaattagtattaatttcgccaggagtatatatataaatatctaaagactaaa +agactcgtacttttacaacttacgtcgtagcataattaaatcatgggtaaatgtcatcag +taagtgcattagaaatactcctttgtaaggatacagtgaatgtgtctcagcaagtcagta +gaaatggaaattcatactcgattaaggcctataaaactgttgttggtatctacagagtga +ttaaaattagtgaatcagattacgaaaatgttttcccgctcgcacttacgcgtttagaca +aaagtacaggtggtacaattggctgtagtagaattttggtataaaataggtgataaaccg +gatgggtgtgggcgaattcaaaagcggtttttgttccatagaactatgtagttggttata +aaggttgtaatctcggagattaggttagggcttaatcagaatagtaacaatttctctatg +taaagtacagtgggtgatcgtatgagttcacgaactcttaatgccatgcctggacaggat +aaacaatacgcatataacttgacgatcgagcttatatcgacctatttgagaagtttaacg +ggtcgatataatatacaggtcttaatagccgattttttctagaaaagcaatcctatatct +tagttaatcagatcaaccccgtgaacgatatatcagcaaactgaacattgtatacaacat +tcctttttgtccgggtggggactccatttaaagtatctcacctagaactcagcggtaata +gatgcagtctcttgcccagttacggtaactaaatgttgatacttagaattgctaaatttt +agtctagacatttccaggtaaaccggtagacgacaatttctctgtcatctgtcataagat +cgcttagtgtgctcaaattgcaattgagggccctactatagacaatcatcagacttttta +attaaatagttttccatgaatgtgttgtcaaggcggaccccttcacttttatcacggctc +ataaatgtcgtatgactgtagtcggtagcggccttcgagtcttcaggggaaatggaaaag +aaattaggcttctaagatggactataatcgattaggctaattccgttcgcaaatcacaga +agcaatcttactcaaaattgttggaatcgatagcgaacgcgaccgtgaatgtttaaaagt +gctcgcacagaattacccaatacctatcatcacgacttaaatacccaaagcagttgtagt +cgcgtaatagattaagtctgaagcctagagacaaagggatactgggcggggaaacctgct +ccttcacggtaacatggtaacaacagaatttggttaaggttaaaacgaaatatactcgga +gtgaattactgttaggtttcgtcatcggatcaataagtagtttccgtgaagacactctta +tattagatctccgaaattctgacccgtgcattaggcacttggtaggagattccatttgga +acttgctcaatgtaagccagtaatgttccgaaataattcgctgcaggagcgaggagccgc +tgaataaaggaccctcgcatcttgttaccttatggttgagggtcaccgttctctgcgtca +attccagagctggagatacattcatcaacgttacctacgcacagaataaaaagatcgagc +gctaactcgttttcctaaacacaacggatttagacaaattaccgaatgcgccggagagta +gcatcttagtgtcatgcctatcatggcggctcagtacgaagagttcaggcatcgaatatt +gtggtagcccgcactcaaagttccgccattaggtaagctatatattgtggtcagaacttg +aggacaactatgagctactaaaaataaacaattttgtcatttgttctagatatgtggcat +tcatcgaacgcttgtaccagaagttacattcgcagcgtgagcgaataaacccgaatgagc +gtaacattatcaataacatatagttcagatagagaacgaggtattcgacagagaattacc +caacattggttattaatctatgcagaataatttagataatgtcactacataatattagga +ccaaaaggtgattccccagaagacaaaacaataaacaatctcacatattcgctagtacct +atgtatgggtatgatcttctgattggacggggataatttccaggtatattaaaacttatt +accataatctagacctaagagaggttatataagtaaagagctgtgttccgatagaaaaac +ccgaccttaaagacttgcgaagtaaattttgctttaacaaaaaaacctacgtaagggaat +attctgtataaactgaaaagtcaggtgtaactacatgagtcatgtcttcgattaattaca +atgcgatctcgttattctgatcaactaatatcataaactgccactacatcttgtacaatc +attcgcaacaatacttttatgtgctaaggtcacgtgcttcctctgctatgctgatttaat +cagattcataaaggaatacgaataactctggatccattaccacgcaagggatttatttac +ggctgattactttttggctgttgacagaactgccatgaaagtaagatgtcgcatcttgca +taaataatagcacctaatatagccgacaaagtgattccgataacagattttaagttgtcc +agccttgagactccatgaagaccgcttgggagcttccccgtgattagaagaatctaaatc +ccaagtggatggggggagtttaaatctcagcaccaacaaatagtacttcctctcagagcg +cgtcatggtcgaaggagcctatcctgatagaggtttgaaagcgcacgcgcatttaactgt +catattaaattggaatctcgtaagtgtcggcagtacgacaaattttaactgatgtcggta +tacggagaagaaggaagcacgcattgaagcagctacgcagaactgagaagatgacactct +aagatacaattaatacaaaaacgttttaagcccaatctatcaacagatgtaagatgtcta +atacacaagaataaaaccttcatgtcccgatgtataataacagctttatttctgctggtc +gaggtgaagtagtggaaattactccatcttgctgcgcgtctttatagtgttggctactct +gtaaccgacgcgtccatccctctctcctagtgatccgtatatccaattagaggataacca +acatctgcgttaccgacgaatttaaatttttcgactatttaattccgttcaaacccgtat +tcgtagtaagtgtttcatagatttatgaccgacatcgtgtacgagttgcagtgcatatgt +agataccactaattgctgatctaggatacatgctttataaacatgcttacttggctattt +tatttactgtcatgtgggggtttttattttcaacaagtatgtgctaccattggataatct +ggcttcaaattgaagatatgcgttccaaacttgtctactgtttgctaagtaggagttgtc +ccattagaactacgcagcacgtggtttgtgatcgaaaagaataattggcaaatacgaggc +tagccttcaaatttaatgcagattactcctcagaaacacacgtaagcgacgaacgtgatg +tttactacacaatgcgtatcatagaaattcgtgataatttttgttccaacctttgaatct +agactgagtggaaaaagatttcaccgggataccgtttatgctggttttaaaaactcgtcg +aatcatcttataactgcattcaaatggatttctcaatcatctgtacgtcaactgttttaa +caataacgtcagaataaaccggcacaatgagacggcggtctttcactacaccacaccctt +aggattataagtgacgtgtggattcgaattctaaggtgacgggatctacaagcctcagct +acattaggtctgaagatctttcgtatagccgcgtatgttactgtttggatatgggttatg +ctaatcaacagttgacagcgagtgaaacggccttgcgacctgaaatctttacggttacct +tttgattcaagacaggatcgacgatggaccacgtgaaatgaattcaaaactgtaacatcg +cttgtgcctcagcgaccgagtaacgacaagttcacatcctctatgcaactatcattgtgg +tcattaaggtattcaagattaactaagagtcgaccatatattctagagttttacaattag +gaaccgttagtctagactaggagcgtgcaacatcgcaggaggtgtggactgtcttgaccc +aagttgcctgacacatagtgtcttttgcttcatgtccttagcaatgcgatacctcaatcg +tagttttatcgggataaataacatggtgtttaaccctattaatggtttctattaatctaa +attgtaaggcagcccttgggtcgaaagcacattaggccacatacacagtatgaaattgtt +cgagtgtccagaccataattgactaccatggtacacggtgttgctattatgactcccgca +aaactcttgacagagggaattttggtacattgatgtaatcgatgatttaacagtaggaac +tagacgtcatccgttagactgagttccgacatgctcaaattgtcaggatttttatccaat +aactaatggctctcacatgtaaataaaatcacattaacgtcacttagtgatggattcgct +aaacagatagactatcattcatgaactggcactgtttcgattatatttgcaacatcgaac +atacttaaagttaaatacgacatcattcaattaaaaaaattcagtacacctctaatgagt +atcccgctttggaggaaagagtagcactttaaatggacaatttaggccggactttcctgt +aaatggatgaagtcattgtacagcttgaataaatcgttagggttagtccttacatccacc +atatgttaatgaataaagcctgagggaccttagagctaacttgtccaacacgttgctcat +ttacttaataaggttgaaatgtatcagtaagtgacagcgagtgtagattttgaccattta +actgaccttcacagttttgtcttcagacgtcacttacaccataatgatgacagagcttgt +agatgcacacactcattcctagtgtaaatcaagtagtagctagattattataaagagata +ttttctggcgtcgaacgtaacacagagagagtataaggggcatgataatggcttatcaat +atgtgtaagaaaaagtttttaatatcatctaactcggtggaatgcacacttatggccaac +tgaccttgggacgagttaagataccataagaggttgcctgtaagttaagataacaaaggg +atattccatctttgtgtgctaagaacctatttatatttgcagccataaaaacctctgtgc +tatgcagccaccagagttatttatacaaagaaagagaccatttagatacgttaattctgc +ttgcgatttattaaacagacatttcacgtccaaccactacaaaagccctatcgcaagacg +atcattgtattatagcctatgcaacgtagctaagcggccgaggaatcataaaatatgaat +tgttacattgtttactacatatgatcacaatctttgtaaaaggttcgttcgtgatactac +catgtacctaactaacctgagatatatgcaatgacttatggggtcagcgcgcaacatccg +caaagcatagtaatacaaggtaggaaaacttctggatttcccaaggttataatgctctat +actgaccaagagatccgttacgactcgcaatgaatactctaagggcactcacaaagaaaa +ccactaattgataaatttcaatgataatatcctgaattgcatcgtgtatgagttacgaga +agtcgcatttaatgaattagtcatagaaatgtcatagcaggaacataattactatatttt +aacgatttaatcgtagttggagtcctttcccaaattatgtcatcagttccgatttagatg +ttttcgggcccttcttagtaaagaagttaatatccaagactagctcctcacccacgcatg +cacatattcgcgagaagtctgatagaatattcgacagaaatgcgactctagctcacactc +gttaactgatcaggtacttatagacaagtacgttatcagatatcgcttcggggcattgtt +gcgctacctttgtgcatagcagttttgaaaaattgttcaagacctgaacgggaaaatgat +attatttttttaggaggaataatacagtaccatgtaaatactcaaccaccttacgtactt +cttacgccgaacatatatggcacgtgttattcggctaacaaaactgttgtgccttttcta +taaggataagcagattcgttttaaacatatgacctgtaaactgggatctacaaaagaggt +acttaaaataaattgcgcaacggtttagatctgcggatctttggttaaagagcaccatta +gatgtgccatacttcctatcgcctgagcgagaatttagtctgaggaaccactcttgggat +ttaaaacaattcggttaggacacctactcggcggatgaagcaatacgataacattaaaag +tcgttcagtctaattttggtcgtagtacgatgagctgatggccaattgtatttttattaa +cagcactgaaacaaaatggagactttagactaatactaaagtctcaatgttcgtcgaacc +ttaaatgctcggaatgaggggatcttcggaagtatagcgccgaagtgtatctcattatta +taacaccagtgtacagacgacatctaattatggccagaaactgtcattgtgccattaaga +ggattagtagatagtctggaccgtggaatagaattttgaccaaattgaccagtcctgctt +gtagacagcgcgatctaaactgcacgagaatatacaagttggtggtgcttgtggctgagc +acgctaagatgcgtttgtttttacgattctagtgcttcttaacgcaattcagtcttctag +atccgctattccaacatcaatatctcaatttaaggtcaatatatataacaaaattagaca +gagcagctgacacttacgaagcatcgtagaaccgatatagtcgaccttatgatgatatgg +acgtgtccaagtccgcacttccgatgcatcttgacggtgaaccgaaatgaaatcttcatt +agggcccccatgtgtcaaaccactcgagtcccgtctctgaagtcaagtattactgcgaaa +aattcgtctactattagtttattatgaacttatgacgcttaaataaattaaacagtaagc +ctgggaaaatgttaaggcaggaatctttgtaacagttcataatgttgctaaagattatca +gaccccgtgaagacttcgggctttgggcttcgtaccgtagcataatacatctatatagtt +agaggcttgcgtgttgttgtgctattccacatatagcagctctgggcgactcttcaatga +aaatgaaaaatggtaacctggcgacctacttgttaagtcagtttaattcaaggggattaa +gtaccaagggtcgagtttctctgtatttattatactgtaggcaagaagcttttttggcga +gatttaagacttaagcctatggtaaaaatttgatagtgagcgactatagtaagagatttg +ggtggttagtaattaaaattctcctatgctaaatcaggcgtacaatctgagggtgcacat +ttctcgacgcgtgaaccttcaccgaaagcgtgtggattatacaaatttcaaacatattgg +cggggcacttatccataatagatttctgtttgtacgccaaactctgcctcacccctccat +aaattgtattggctagaggttaaattctccgtaaatagagacacatatagttttatacaa +ttgtttgaatcaaagcacgagaaacttttaaccgtacattgacaaatgtcttcggatggg +gcagagcatctcttcgtgacccaaatcaatcgctgagcaataagcaagaaaacacagatt +atacaaagagatctggatgaagatattcgtgcaatcactatcgttatgttagagagttcc +atgcatgaggactcgttttttgaccaggagaattaagccaagaaataactgacgtatttc +caaatgaattctacgtgtttttcctgtcacctttagccagtgttaaagatgactatggag +tttcgaataggttattctatagacattataacgagtggaacacccataccttcacagtgc +taaaggtaggaacgggtacgtcaggtagttcaagggattttaggttcttaatccaacgaa +gaaataacgcatcacccgtcattctattgttttcgtcgggattacttagtaggcagggta +ttctaacctacctgagttacaaatctttaaaaaactggccatgaggtcatggtgataaaa +tctgaatcgcctaaattcgcgtccctaaggaaatatactagaatccgtctcagaaagtgc +aaaggttgacttcttcccctaacacagaattctcagttttatagctatctagtggcattc +ctttttataaaactttacgtttgtaagggtccaactttacaaaagctcggatgtgtatgt +gtaatcttccgccgtgtaagacttggaacccatgtatattgacggcatggcgtggctaag +caggtattgatcttcagtgtaaagcaaggtatgttctaatctaacaatgtaaagccgggg +attagccgccaaaggggtctaatgacatagagatgctctgaaatcgtaccaactataaaa +gcacgggatttgaaatatagcgacagatcttccgtattctgttagttgacatctgtgctg +tctttaccgattgtgatttggctttagcagtcatttagtttcgttactcattgctcgtgc +gatagttccaccgaatatggcacattcgttctttttttccattttactgcaaaccttttc +aaaagctgatcgataccactgatgatggcattgattagtcgattggcaactatgtcctgc +ttatatctccaattgcattgaatatagtaaaaaataaaggctcgccttcccaatgggcta +cggagtacacgaaaaaatcgcaactcgtttaaccaagcgccgtacctaacatataagtga +ttgagacaaatagttctccagacgtattgagatatatgtctcctataggcaagcgtttct +aattgctgaccagaaattagaattaggttgttaatactatattcgaccattttattccac +gaatgtgctattctactggtattgctccgtatgcgatatataaccaacacggaaagtcgt +cgattgcaaagtggctccgtagaatcatttctggtcatttaccgggagcgcgcttgaaca +atggatgcggtatctgccatattgttattgttaaaaagacttccgcttactatcgcttcg +atcatcggaaaaatattaatgaggattgggtcgtataagaaaatcatcttttcagttcgc +agatttttgccaatttaaccggttatttcgtcagacttggtagtgtagttacaagcatca +cgattatatcagctacagaattaaactgtcctgactcgacggggcagtgtgtgagtattg +cgctatatattcaaggtaacaggaggcatataggtcatagtacaaggataatgaggtttg +ctaactttaaaaattattgatttaacggttgattgaaaatctctgcaagatgacgctaga +acacctgatgttcaagtttgccgataataacatataagatgaattactgtctttagaccc +tcatgttaatccgctaacttagggcggaaacaatgttaggctatgcggagtaagtactat +attatgataccacatagaatttaacattcatatgatgtctaatacccgttcccaaccttg +caaccgtcccgattaattaagcaattacggtcatcaatgggccaatcctgtctcaaaaat +tatcatattcaaggttcagctattttggcaatgggtgagtaccgttcttagtgatttacg +aacccataatctaggcgacttaatatacaagatttagagttacgttttccgggtagtaca +tattaacgaccatggatcgggtgaggtgttgtattagttatctgatcttgtcagtagctc +ccaatgtcccagaatattatgtttctactagagtgttcgtatactggaatttaaatatta +tgtaagactagacaaattttatggatacattaggccatcgtagaatatgatatagttgta +acgtccctctatagattttcggagggcaggtatattgcttaataaagatgttcggaaatc +agcggaaaggatttgtaattaactgatgcgcagcgcttaaataagtttagactattaagc +tatatgttcgacagcatgtagttttttttaccagaaagtgttatactgatgacccatgga +ggtagctcctcatgataaaaatattgttacttaagcattactattatagtgttcaaacta +gtaccgttgcatactttaagaatcagacatggcgtttcttatgcagacacacttttttag +ctgttgacgcccacctcacatccatagtaggtcaatcgcataagaacaatattctggact +gttttattacccagaagaaagttttttctttccggttcgttaagacaataaagatcattt +cattcgttctcttaacgatgaactaaagtacttaaagtatccgcctcttgtttcgactag +cgcatagtgtaataattaaggcaagataagaagaacaggaacgcgcacgtcggagataac +tctaatagtctctttattccgtttaatatagcccgtaattgcaccatgcgctacagtaac +ggccgccttcgcaaacctatttatgtaattccaagtttaggtatgcaatggttggggcaa +tgtgaggggttttatcaagactttcgttgcttcgcggggggcgcaaagcagactttacag +tagttaaccgaaaaccgcagggagtcgctctaagtgttaccaacccctcactactacgcg +aaggtactcgattattccttgaatgggctgaaacatcgtgattagcgtcttatgattcag +gctgatagaagaaaacttattttctatattccacgtatacaatcacactcgtaactaaat +agttcccagcgttgtaatgtcgctataataaataaaatacaaagaaaattcgtctgggtg +cataagtacagttagtcgtctgtcacataaataatccgcagtcgatctcattacaggtat +tgttgttggtcaaccttcgcaaggtggtccaagtagcattgttgaacagtaaaactaccg +tcacacaaggaatatcataatagatgccatacacggttttacttgatatgtttacagtcc +ttgagttgcaatcgtagtattgtttcatccggggtgtgtacgaagtaatttagacaaggt +gtgtagcggtcactaggtaaaatgacttaggatggatgagcatttaggtattctatgata +acactaaccatcatgtttctaaaatcctcaggaaatttgtattattttaccaacctgtat +ttatagaaagtgcttttgacttaaagaagccgaagtgttcaaattaaggagtacctgatt +gaaagaatggggaattgtaatctgtaactcaattacaaataagccgttctaaggattaag +gctttgtgtctaagcaactcacgtgaattcgaaattcatactcgattaacgactttaata +ctcttctgcgtatctacagactcatttaaattacggaatatgttttcgtttttggtttcc +agctcgcacgtacgcgtttacaaataaggacacctggtacaattggctggagtacaatgt +tggtttttatttgctgattatcccgatccctgtgggcgttggcataaccgggttttcttc +aagactactttcgtgttgcttatatacctggtaatatcggtgagtagcttagggcttaat +cacaatactaacaagttctctatggattggacagggcggcatccgttgactgaacgatct +attaatccattccctgcactggataaacaagacccatttaaattgaccatagagatgtta +gcgtcatatttctgttcgtgatagggtacatatattataaacggattatgagcagtggtt +ttctagaaaagcattcatagttaggagtgtatcagatcataccactgaaccatagagcac +aattctctactggctatacttcattcctttttgtccgggtggggacgaaatttaaaggtt +ctaacctagaacgcagagcgaattgatcaaggcgctggccaagtgaacggttctaaatgt +tcttaatgagaattgcgtattttgactattgacagggcatcgtaaaccgctactcgactt +ggtatctgtaatctgtatgtagatagagtacgggcctataattcaaattcagccaccgaa +gattcacaatcttcagacgtttgaaggaaagaggtttactggtatgtggtgtcaagcccc +acccattctctgttatatccgagcattaatgtagtttcactgtactacggtcacgccgta +gagtcggcagggcaaatccaaaacaatttaggctgagaagtggcactataatagtttagc +ctaagtcccttcgctaataactcaacaaagatgacgcaaaagtcggcgaatagattgcgt +tcgcgtaagggtatcttgaatactgatagctctcatggtaccaagaactttcataacctc +tttatttaccaaacctgttctactagcgttagtgttttagtctgtagccgacacaaaaac +cgagaatggccggcgtaaccggcgcctgcaagctaacatgggatcaaaactattggctta +acgtttaatcgaatgagactagcactgtattactctttcgtttcggcagcggatcaataa +ggaggtgacggcatcactctcttatagtagatatcacttattctcacaacggaagtagga +tcttccgtcctcattaaatttgcaactggctcaatgtaacactgtaatgttaacaaagta +tgagctgaaggtcagagcagacgatgtagtaaggtccctcgaagctgcttacagtatcct +tgaggctcaacgggctatgcggaaattccagacctcgagttacattatgaaacgtgtcat +tccatctcattaaatagttcgtgccctatcgccttgtaatataaacaaccgtttttgtct +attttcccaaggagaaggagagtagcagcttagtggcttgcctatatggccccctaagta +cgtactcggcacgcttagaagattgggctaccccgcactatatgttcccaaagtaggtaa +cctagatagtgtcgtatgaaattcaggtcatcgatgagagtataaaaatatacaattttg +gcaggggttatacattgcgggcatgaagagtaacattggacatgaacggacattcgaacc +ctgtgagtttaataccctatctccggatcattataaagtaaatatacgtcacttactcta +cgtgcgtttagacagtctttgaaactaaattggttatttttctttcatctagatttgtct +gtatctaactaaattatagttccacataaagctgattcaactgaagacataaatataaac +tttctaacatagtagcgaggaaagagctatgcctagcatcggatcatgcgtccgcgagta +gttcctggtagagttaaaagtttttccagaatctagaccgaacacagggtagtgaacgaa +agtgcgcggtgaacatacataataccgaacgtaaacaattccgttcgtattgttgctgta +tctatatttcctacgtaaggctatttgatctataatatgaaaagtcacgtcgaaataaat +caggaagcgcttcgagtatgtacattcagatctccttagtatcatcaaattatagatttt +acggccacgaattattggtctagatgtcccaaaaataatttgatgtcagtagcgatcgtg +cttcctcggagttgaggttggaagaagagtcattatgctataccaagaactctccatcca +gtacctagaaaggcaggtatgtaccgctcattaattttgcgatcttgacagatctgcatg +caaagtaacttgtaccagatggcttttataatagaaactaagtttcccgaataacggtgt +acgataacagatttttaggtgtacagacgtctgactcaatgaacacacattgggacctgc +cccgggaggagtagtagataattaccttctccagcgcgggtcttttaatatcacaacata +aaaatactaattaatatcacacaccctcatcctcgatggagcctagcatcatacacgttt +gatagacaacgccaattttactgtaatatgatattcgaatctagtatgtggacgctgtac +cacattgtttaaaggagctccctttaccgacatgaacgaagcaagctttgtacaagatac +gaagaactcagtactggtaactataagagacaatttatacataaaagtgttaagaccatt +atataaaaagaggtatgaggtctttgtaactacaataatacattcatcgaacgatggaga +ataacagagttatttctgctgctcgagctctagttctgctaatttctcaatcttgatgcc +actcgtttgagtcttccattcgctcttaacgacgcgtacatccctctctcctactcttac +ctatatcctattactggttaacctacatctccgggaaagacgtaggtaaagtggtccacg +attgtattcacttataacacctagtagtactatgtgttgctgagagtgaggacacactta +ctctacgagttcaagtccatatggacattacactttttcagcatctaggtgtcatgatgt +attaacagccgttaggggctatttgattttatcgattgtcggcgtgtgtattttcaacaa +ctaggtgctacaattcgtgaataggcatgaaaattcaagattgcagttcctatcttgtat +aatctttcctttggacgagttgtaccatttcaactaacctgcaagtggggggtcatccat +atgaagatttgccaaatacctggagaccctgaaaagtttatccagattaataataacaaa +caaacctaagcgaagaacgtcagctttaataaactatcactatcatagaaattcctgtta +attgttcttccaaacgttgaatagactatcacgggtaatagattgaacacggagaacgtt +tatccggcttgtaaaatatcgtcgaatctgctgataactcaattatattcgatggagaat +tcatatctaccgcttagcttttaaaaattaagtcagattattccgccacaatgagaaggc +gcgagtgcactaatcaaatcacttaggattattacggacgtctgcattacaatgctttgg +ggtagggttatacaagcatatgattctttaggtctcttgatcgggcgtttaccaccgtag +cttaatgttggcatatccgtgatcctaatattctgttgtcagcgtgtgtataggaatgca +caacgcaaatctttaagctgacctgttcatgaaagacaggagacacgaggcaccacctca +attctatgcaaaactctaacatagcgtggcactatgagtacgtgtaacgacaaggtctca +tactcgatcctaagataattctcgtctggaaggttttaatctttaactaagagtagaact +tagtttattgacttttacaattaggatacggttcgcgactctaccacagggcatcatacc +tggagctctgctatctcgtgaccaaagtggcagcacacatagggtcgggtcctgcatcta +ctgagcaatccctttaagcattcctagtttgagagccatttagatattgctgtttaaacc +gattaatggtttctattattataaagtgtaacgctcccattcgggacattgaaaattagc +aataagacaatgtatgatattcggcgagtctcaacaacattatggtctaccatgggacaa +ggggttgatatgatgaatccacaaaaaatagtcaaacacccatggttcgttaagtgaggg +tatccaggtgttataaggacgatctagaagtattcaggtacacggtgttcagacatgctc +taattgtcaggttgtttataatttaacgtatcgctctctattctaaataatataaaatta +accgctcgtagggatgctttccagtaaaagatacactatcattaaggttatgcaaatgtg +gcgatttgatttgaatcttagtacattcttaaacttaaatacgtattatttaaagtaaat +atattatctaaaccgcttttgtctatccacatttcgtcgaatcacgacctcgttaatgcg +acaatttacgaccctctttcatctaaagcgatcatctatttcttctgattgatgtaatac +tgacccttactccgtacatacaaatgatggtaagcaagaatgactgacgctcctgtcacc +tttcgtggcaatcaactggcgctggtactgaagtagcttgaaagggatatggatgtgtat +gccaggcttcattttgacaatttttctgtcctgctcagtgttgtctgaagtcgtatcgta +cacaataatgatgactctcattgtagatccaatcacgctttcctacgctaatgaaagttc +tagatagtgtaggtgttagacagaggttagcgcctacatccttacacacacagtgttgaa +cggcaagcataatcgagtatcaatagctgtatgtatttgtttggaatatcatatttctcc +cgcctttgaacaatgatgccaaaatgtcctgccctagagttatgataaaataactgctgc +cctgtaacttaagtttacaaaccgatattcaatcgttgtgtcctatgaaaatatttatat +ttgcaccaagaaaatcatctgtgcgatgaacaaaacacagtgatttataaatacaaagag +tacatttagttaccggattgcggcttgacatttattttacagaattttatcggcaaaaca +cttcatatgaactatcgcttcacgataagtctatgatagactagcattcgtagagaacag +gaagagcaatcattatatatgaagtgttacagtgggtactacatatgagatcattaggtc +tatatccggccttcctcataagaccttggaaatatcttacatcagagatatcaaaggaag +tatgggcgaacccagaaaaagccccaaagaatagtaattcatcggacgtaatagtctggt +tttaactaggggttattgatatttaagctaaaagagttccctgaacactcgaaatgtata +atctatcccaactaaaaaagtatacctctaattcagaaatgtcattgagattagactgat +gtcaatacgctaggaggtaagacaagtagaagtttttgatttaggaattgaaatgtaata +cctccatcttaagttctatattttaaagttttatgcggacttcgagtaagtgcacaaatg +atggcataagtgcccagttacatgtttgcggccccgtatgagtaatgatctgtttatcaa +tctctagctactatcccacgaatgcactgatgccagtcatggcgcttacattagtcgaca +gaaatccgacgatacctatcacgcgtgaactgttctggttcttattcaattcgaagtgat +ctcagatacattacggccatgcttgcccttcatgtctgctgagcagttttgttataggct +gaatctcctctaagcgaaattgataggatttttggtggtcgatttagtctgtacctgctt +attaagattcaaaatgacctacttcttacgccgaaatgatagggatcggctgaggaggat +aaatatacgctggtgcctggtatttatccagaacaagttgcctgtgtatcagatgaactc +taatctccgagataaaaaacaggtacgtaaaataaaggccgcaaagggttacatctcagg +atcgtggcgtatagtccaccattagttctgacttacttaatatagactgaccgagattgt +agtatgtggatccaagcttgccatgtaaaacatgtcggttagcaaaacgtataggagcat +gatcaaagaagagttaattaatagtactgcactataattgtcggcggagtaccatgagct +gttgcccaattcgatgtttattaacagcacgcataaaaaatccagacttttcaattagaa +ttaactataaatggtccgcgaaccttaaatgatcggaaggacgggatctgccgttgtata +gaccccaactctatctaatttttataacacctctgtaatcaacaaatcttattatgccat +cattatgtcattcgccaagtaagtccagttcgagattctctggaccgtgcaatagtattg +tcaaattatggtaatggaatccttcttctaacacccttagaaaagccacgagaattgaca +agttgggcgtgcttgtccaggagcaacataagtgccgtttctttttacgatgatagggat +tcttaaagcttttctctattctagatcccagttgccatcatcaatatctcaattgatgct +cattatatagttcttatttagtatgtccagatgtcactgaagatcctgcctagaaccgat +attctcgacaggatcatcagttcgacggggcaaacgcacctatgcacatccatcttgacc +gtgaaacgaaaggaaagagtcagtaccgacccaatgtggaaaaaaactcctgtccacgat +atgtaggcaagttttactgcctttaattagtagtcgattagtgtagtttgatattatcta +ccttatagaatgtaaacagtaacccggccttaatggtttggcaggattctttgtaaaagt +taataatgttcataaactttatcagaaaacctgaagtagtccgcctttcgcctgcgtaac +gttgcagattaattcgttttacggagtggcttgcgtcttgttgtccgagtacacatattg +ctcctctcccccactcttctaggaaaatcaattatgctaacctgcagaccttcttcttta +ctatctttaatgcatgcccagtatgttcatagggtagacttgctatctattttgtataat +ctacgaatgatgcttggggcgcgacttttaacaattaagccgttgggtataatttgagag +ggtgccacgatagtaagagatttccggcgtgagtaaggaaaatgataataggattaagca +ggcgtaatagctcaccctcctcagttctccaaccctgaaccggctaagtatgactgtgca +gtattaattttgaatacatattgcagcccctaggatacattatagatgtctctttcttac +ccaaactcgcccgcaccaagaaagaatgtggattcgattgaggttaaattagccggaatt +acagacacagattcttgtttacaattgtgggaagaaaaccacctcaaacgttgaaaccta +cattcacaaatggattacgttggggatgagaatcgattccggtcaaaaatcatgcccgga +gcaataaccaagaattcacagaggattaatacacttctccatgaagataggactgcttgc +actatccttatctttgtgtcttccttcaagcaccaatcgtttggggacaaccacaattat +gccaagaaataacggaaggtgttccaaatctatgagtccgcggtttcatcgcaacgtttc +actgtgggtatcatgactttggactttagatttgggtattctagagactgtagaaagact +gcaacaacaagacattcacagggcgaaacctaggaaaggggaccgcacgttgtgctaggg +atgtttccttaggaatccatacatgtaagaaagaatcaaccgtaattatagtgttttcgg +ccccttgaattacgtgcatgcctttgctaaaagacctctgggaaatagattgaatattct +ggacagcagcgaatcctgattatatctcaagcgaatatatgacccgcaagaaggatttat +actagaataagtctaagaaagggcattgggtcacttcttccactaacacacttttatcag +ttttataccttgagagtcccatgcatttttatatatatttaactttcgttgcgtaaaact +ttaaatatgatccgtgctctatctctaatctgaacaacggtatcacgtcgaacaaatcta +gtggctacgaatcgcgtcgctaagaacggtttcttctgctggcgttagctacgtatcttc +tatgctaaaaatgtatagccccgcattagcagcaaaaccgggagaatcaaatacacatcc +gatgaaatcgtaacaaagataaaacaacgcgatttctatgtttgccaaagtgattaagtt +gtatcgtaggggtcagcgctgatgtcttttcagtttgggttttggatttaccagtctttt +agtttcggtactatttgatcgggacattcgtccaaacatgatggctcattcgttcttttt +ttcaattttaatcaaaaccttgtatttacctgatacattaaactgagcatcgcatggagg +tggagattcccatatatgtaatcatttgatatcctattccattctttttagttataaata +aacgctccactgcacaatgggagtaggacttcaccaataattagcatctactgtaaacaa +gcgccgtaacgaaatgattactgattgagaaaaataggtctcaacaacttttgacagata +tgtatccgatacccaagcgttgctaattgcgcaaaagtaagtagaattacggtcgtatta +cttgttgccaaatggttattactccaatgggctattctaatccgatggatacgtaggaga +gagtgtacctacaccgaaactcgtagtgggcttagtggctacgtagaagctgttcgggtc +agttacagcgtgcgaccttgtaaaatcgatcacggtgatgaattattgttattgtttaaa +agaagtcccctgaatagcccttagataatacgaaaatttgttatgtccagtcgctcgtat +atcaaaagattcggttaagttcgcagagttttgccaagtttacaggtgatttactaacac +ttgggagggtacgtacaaccatcacctggttagcagagaatgaattatacggtcatgtcg +cgaagggcaagtgtgtgagtattgaccgagttattaaacgtaaatgcaggcatttacgtc +ataggacatcgagtttgtcctttgcgaaatgttaaatttatggttttttccgttgagtga +taatagctgcaacatgaagatagtaaaactgaggttaaactttcaccatattaaattata +tgttcaattacgcgatgtacaaactaatgttaatcagatttaggagcgcgcttaatatgg +gtccctatcccgactttgtacgagattttgataaaaaatagtattgtaaattcatttgat +ggcgtagaaccgggcaaaaccttgaaaaaggacacatttaggatgctatttccctaagaa +agcggaaaatcctggctcaatatttataatagtaatggttaagattgtggcccaatcgct +gagtacccgtcttacgctttttccaacacataatcgacgagaatgtatttaaatgtttga +gacttacgttttccgcgtacttattattaaagtcattggagagggtgtcgtctgggtgta +gttttctcatctgctcaggagctaaaaatgtaaatctattggttgtttctaattctgtcg +tccgtgtaggctatttaatttttatggtacacttgaatatgtttagccataatgtagcca +atactacaatatcagatacttgtatacgacctatagacttttgccgaccgctcgtagagt +gatttagaaagatgttcggatagcacagcaatcgtttgcgaatgtaagcatgcgaagcga +gtatttaactgttgactattttgctatatgttactctgaatgttgttttttttaccagaa +tgtgttataatgatcaaccatgcacgttcctactaatcatataaattttgttacgtaagc +ttttctatgatagtggtctaaagactacccttgcatactttaagattaagacatgcactt +taggaggaactcacacgttttgagctgttctagcccacctataagccattcgtccgcaat +cccataactacaatagtcggcaatcttttattacccagaactaacgtttttatttcccgg +tacgtatcacattaatcttaatttaatgcgtgagagtaacgatgaacgaaagttatttat +gtttaagccgcttcttgagaatacagattactgttagaatgaaggcatcataactagaac +accaacgcgcacctcgcacattactctaatagtagctttattcagtttaatatagacagt +atttgaaccaggcgctaatgttaaggcccccttcgaaaaccttgttatgttattccatgt +ggtcggaggatttgcggggcgatagcgctgggcggggatcaacaatttcgttcatgcgag +cgcccccataaccagtaggtacagttcggaaaagaaaaccccacgcactcgctagaagtg +ttacaatcacatcacttcgtaccgaagggactactgtattccgtcttggggatgtaacag +actgattacagtcttatgatgaagcctcattcatctaaaattagttgatttattccacgg +atactatcacactcctatagaaagagttaccaccgtgggaagctagatataataaataaa +agacatacaatattagtatggctcatgatctacacttactcggatctctctttttttata +accagtagatcgcattacacgtattgttgttccgcatcaggccctaggggctcaaacttc +catggtggataactaaaacgtccgtcactaaacgaagatattaatagatgaaatacacgg +gtttacttgatttctgttcagtcattcacgggaaatcctaggagtctttcataacggcgg +tcttagtaggaatgtagtcaagctctgtagaggtctcgacggaattggtatttcctggca +tcacaatttacctagtattggagatcacttaaaataatgttgagataataatcaggatat +ttctagtatgtgacaaacctctatttagtgattgtgattttcaattaaacaagacgtagg +ggtcaaattaacgactacatgttggaaagaaggccgaattgtaatatctaactcatgtac +taagaagaagtgctttcgtttaaggctttctgtctaacattctaacgtcaattcctatgt +aatactactgtaaccaagttattactcggctgcgtagataaagtctcatgtaaatgacgg +tttatctgttacttttgggtttcaacctagctaggacgccggtactaattacgacacctg +cgtatagtgcagggtgttcaatgtgcctttttatgtccggattataaccatccctctccc +acttggaatatcaccgggttcttaatgacttagttcgtcttccttattttccgggtaaga +tcgctgtggaccggacccattttgatctagtctaaaaaggtatatagcgtttcgtctggc +ccgcttacgttcactgaaacttagattaatcaatgcactgcactggattaacaagaacat +gttatagtgtactgacacatgttagactaagaggtctgttcgggttagccgacttatatg +tttaaccgattttgacaactgggttgagagataacaatgaagagtgaggactgtagaaga +tcttaaaactgtaccatagtgctcaattcgctaatggcttgaattatttaattgttctaa +ccctggcgtcgaatttttttggttcgaaaatacttagcacagcgtattgttcaacgagat +gcacaactgtaccgttagaaagcggcttaatgacaaggcagtattgtgactattgacagg +gaatcctaaaaagctactcgaattggtatatggaagaggtatgtactgagaggtcgcgcc +tattagtcaaattctgccaaagaagagtcaaaagcttaactagtttgatggtatgaggtt +taatgctaggtggtctataccaccaaaaagtatatgggatatcccagaatttatcgactt +tcaatcgtctaccgtcacgacgtacactaggcagccctaatccaaaacttttgaggatga +gtactgccactattatactgtaccatttgtaacttacattttatatcttcaaagaggtag +atattgtcggccattactgtcacttacactaagggtagcttgattactgatacctctcat +ggtaaaaagtaatttaagaacctatttttttacataacctctgctactaccgttagtgtt +ttagtcggttcaagtcacaaaatccctgtagcgcacccctataagcagaaggaaacctta +atgcggataaaaacttttgccggaaccgttaatcctatgagaataccactcttggaatcg +gtcctttaggctgaggatatagaacgaggggaacgcatcaatctaggttaggtgagagaa +ctttgtatcaaaacgcaagtaccatatgccgtcctcagtaaattgccaaatgcagaaatc +ttacactcttttcttaactaagtatgagagcaacctcactcctgaacagcttgttaccta +acgagaagaggctttaagtagcctggagcctcaaccggatatccggatttgactctcatc +cacttacatgatgattacggtcattacatctcatgattttctgagtgccctatagactgg +gaatttaatctaccctgtttctatttgttaacaaggagaaccactggtcaagatgacgcg +cttccatttatgccaccataagtaagttctcggaacccttacatgattggcctaccaacc +tatatatgtgaccaatgtacggtacatagagtgtggcctatcatattcaggtcatcgagc +tcagtatttaaagattatatggtcgctgggggtattcagtgcgcgatggaagactaacat +tggaaatcaacggaattgacaacacgctcactttaataacctatctcaggataagtttaa +tgtaattagacggaactttctctaactccgtgtactaactctttgaaaataatgtgggta +tttttatttcatctagatttgtctgtatcgaaagaaagtattggtccaaataatcctcag +taaaatcaagtcataaatataaaatttagatcttaggacagaggaaagtgctttcccgag +cataggatctggcctacgccagtagttcatgcttgtgttaaaagttgttactgtttatag +tccgtactcagggtagtgttcgatactcagcggggaactgacatattacactaaggaatc +aaggcccttcgtatgggtcatgtttatatatttaattacttacgctatttgatcgagaat +agctatagtaacgtcgtaagaatgcaggatgcgattcgagtttgtaaattcacagatact +gtgtatcatattattatagatgttaaggcatagaattattggtattgatgtacaaaaaat +tatgggtgggcagtaccgataggcattacgagcagtgcagcttggaagaactggatgtat +cctataactagtaagagccttaaaggtactacatacccagggatgttaccatcattaatt +tggccatcttcaatcttcgcaatgcatactttcttctacaagatgccttttagaagacaa +aataagtgtcaacaataacgctgtaacttaactctgttgtacgtggaatcaagtctcact +aaagcaactaacattccgacatgcaaacgcaggactactagattattaaattcgccagcc +cgcctcgtttaatataacatcataaaaattctaagtaatatctcacacactaatccgcca +tcgtccatagcatcagtcacctgtcttacacaaacacatgtttaatcgatgttgttatgc +caagctagtttcgcgaccatgtaactaattgtggaaagctgctaccttgaacgacatcaa +ccatcctacctttgtacaacagaccaacatctctgtactggtaaatagatctgaaaagtt +ataaatataactgttttcacattgatagaaaaacagctatgtgctatttgtatatactat +aataaattaagcgaaacatggagattaaaacagtgttttctcatcctccacctcttgttc +tgctaatttataattcttgatgccactcgtgtgagtcgtccattcgatcgtaaagaaccc +gacataaatagatacgacgctgaacgagatcctatttctcctgaaaattattagcacggt +aactcctagggatagtggtactagttggtatgaacgtataaaaacttgtactactttctc +gggatgtgagggagcaaactattactcgaccagtgcaacgcattatcgacagtaaaagtt +ttcagctgatacctgtctggatggattatatgcaggtaggcgagagtggattgtagcgat +gctcggcgggggtattttaaaaatctaggtgataaaagtcctgtttagccaggaaaagtc +atcattgcactgcatatcgtcgattagctgtcatttcgtccactggtaccagttcaacgt +acatcaaagtccgggcgcatccatatcaagttttgcaatagtactccagaccatgaaatg +gttatccagattaataataacttaatatactttcactacatactcagcgggtattaaatt +tcactttatgtcaaaggactcttatgtggtcttcaaaaaggtctagagtctatcacgcct +aattgtgtgaaaaccgagtaacttgatcagccttgtaaaatatagtagaatatgatgtta +aatcatttatattccagggagattgaatagcttacgattagctggtataatttaactcac +atgattaagcaaatatctgtaggaccgagggaaagaataaaataaagtaccatgagttcg +gaacgctgcattacatggcgttgggctagcctgatacaagaagatgagtatggagctctc +ttcatcgggacgtgacaaccctagcgtaatcttggcagatcccggagcagatgattatcg +tctaacactgtctttaccaatgcacaacgcatagatttaacctgaactgttctggattca +ctcctgactacagcctacaactcatttctatgcataactcttaaagacagtcgcaatatc +agtacctctatacacatcggatcagactagatcataagataagtctcctctggatccttg +tattctgttaagtacactacaaatttgtttagtgtctgggacaattacgataagggtcgc +gactagaccacagggcatatgacctccaccgctcctagcgagtctccaatctgcaagcac +tcatacgctaggggcatgaatcgactgtcaatgcactgtaagatttacgagggtgagacc +catttagatatgcctcgtttaaccgttttaggcttgataggatgagtttgtcgatccatc +aaattcccgacattcatattgtccaataagtatatctagcttattcggactcgctaaact +aaattatggtataaatgccgtcaaccggtgcatttgttcaatcaacaaattatagtcaat +ctcccatggggccttatggcagcgtatacagctggtataacgaccatatacaactatgaa +cggactagctgtgaactaagcagattattggatccttgtgtataattttaagtttcgatc +tatatgctatagtatagaaaatgttccgatcgtacgcttcctttacagttaaacagtcta +tatcatgaagcttatccaaagctggacatttgatggcaatcttacttaattatgaaactt +aattacctattattgaaagtatttatatgatcgaataagatttgctctataaacaggtcg +tccattcacgacctagtgattgcgtaaattgaccaacctaggtaatctaaagcctgcatc +tatttcttatcattcatgttatactgacccgttctcagtacttaaaaatgatcgtaagca +agaatcactcacgctcatgtcacatttagtcgaaataaactgccgatgggaaggaagttc +cgtcattgcgatatcgatgtctatcccacgcgtcattttcaaattggttatctacggata +actgtgcgatgaactactataggtcaaaattatcttcaatctcattctagatcatataaa +gatgtccttcgcgattgatacgtctacagtgtgttggtgttacacagagggtagcgacta +cttacttactaactctctcttgatccgcaagcataagccaggttaaagtgctctatcttt +ttctgtggattataatagttataccgccttgcatctaggtgcccattaggtaatgcccta +gtgttttcataaatttactcctgccatctaacgttactttaatttcccagattcaatagg +tctctcatttgaaaattgttatatgtcaacaaagaatataatagctgagtggaacaatac +actgtgagggagtaatacatactctaaattttctttacggtttgcgcctgcacagttttt +tttatctatgtgatccgcataaaaagtaatttcaacgttccattcaagttaagtcttggt +gacactagcattaggagagatcaccaagaccattatttatttagctagggtttaagtcgg +ttagaaatatcagataatgaggtctttatccggccttacgcagtagaaattggaaatttc +gtaaagcactgagttcaatggaagtatggccgaacccacataatgcacaaatcaagtcga +tttcttccgtccttttagtctcctgggaactacgggttattcatagttaagctaaatcag +ttaacggaactagacaaatgtataatagttcccaaatatatatctataaatcttatgcag +ttagggaatgcagatttgaatcatggcaatacgctagctcggaactcaactacaagtgtt +ggatgtacgaattcaaaggtattacatccttatgatgttcttttttggatacttttatga +cgacttccacgaagtgaaattatgttcgaatatctgaacagttacttggttgagcccaag +gatgacgaatgttctgtttataattctcgtcataatataaatacaagcatatgaggccag +tcatggagctttcatttggactaacatttccgtagagtcatatcacgcctgtaatctgat +ccgtctttttctattcgaagtgttatcagatacatgacgcccttgcgtgacattcatggc +tcctgacatcgggtcttttaggctgaatctaatctaacccaatttgtttggattgtgggt +cctccattttgtctgttaatgcttattaagattaaaaatgtactacgtatttagacctaa +tgattgcgatacgctgtggaccattaatataagctgcgccaggggatttttccagatcat +ctggcctgtgtatatgttcaaatctaatagccgagagaaattactccgacggaaaataaa +ggcagataagcgtttcagagcaccatcgtggcgtttagtcaacctttagttcggaattta +ttaatatacaatctcactctttggacgagctccttaaaagatgcccttgtatatcatgtc +ccgtacctaaaagtataccagcatcatcaaagaacagttaaggaatacgactgctctata +attgtccgaggagtaccttctcatctgccaatagtcgttgggttggaaaacaacgcatta +atatgccacacttgtcaattagaagtttctataaaggggacgagtaactgatttgagacc +tagcacggcagaggacgttcgtgtgacaacatctctttataagtttgagataaaatcgct +aatctacaatgattatttgccaatcattatcgaatgcgcaaagtatctcctgttcgtgat +tctagcctaaggccattactatggtcaaattatgctaatcgaagcagtcttctaacaccc +ttagaaaagcaaacactattgaatactgccgccgcattcgccagcaccaacataactgca +cgtgcttttttccatgattggcattatgaaagatttgatctatgattcttaccagttgca +atattcaatttagcatgtgttcctaattattgtgttattatggtctatctcatcatgtaa +atgaagatcatgacgtcaacacagattctagtcaggatcatcagttcctcggggaaatcg +cacctaggaacagccttatgcaaccgctaaacaaagcaatgaggatgtaccgacaaaagc +tcgatttaaaagcctcgaaacgagatgtacgaatcgtttactgccttttatgaggagtcg +agtactgttggttcatatttgctacatgattgtatgtaataacgatcccgccctttatcg +gttcgatcctttatggcgataagttatgaatcgtcagtatctttagatcaaaaactcaac +tagtacccagttccccggaggaacggtcatgattaatgcgttttacggtctcccgtccct +cttcttgtcagaggaatcagtttcatccgatcccactcgatgattggtatagctatttgc +cgaaaagccacaacgtattcggtactatcttgtttgattcccctgtatcttaattcgcga +cacttgatatcttttgtgtttaatcgacgaatcatcctgggggcgacacttgttacaatt +atccagttgcgtttaatggctgtgggtcacaagattgttagacaggtcccgcgtgtcgta +ggaaattgataattggagtttgcaggacgaatagctcacccgcctaagtgatccaaccct +catcaggataactatcactgggcagtattatttttgatttcatatgccaccccctaggag +actgtagtcatgtatctttcttacccaatctagcccgaaacaagaaagaatgtcgattcc +agtcaccttttattagaccgatttacacacaaagtgtcttggtttaaaggctggcatgaa +tacatactcaaaagttgaaaacgacttgctctattcgattaccttcgcgatctcaatcga +ttacgctaaattttaatgcccgctgaaatatccaacatttaaaacaggattaattctctg +atccatgaacttaggactcattgcacgtgacttatctttctctcttaattcatgctccaa +tacggtgggctaaaccacttttatcacatgaatgtacgcaacgtgttaataagctatgag +tacgcgggggcagcgaaacgggtcaatctgggtatcttctattgggacggtacatttcgg +ttttatagactatgtagttacacggcatcaacatgtaattaaaacggcgtaacctaggaa +agccgaacgcaccttgggattgccatgtgtccggaggattacatacatctaagaaacatt +ctaaactatgtatagtcgtttacgacccttgtagtacgtgcatcccttggcgaaaagtac +tctgggtattagagtgtatattatcgacagcaccgaatcctcattttatagcttgacaat +ttatgacccgaaagaaccttttataagtctataagtatatctaacgcaattgcggcactg +agtccactaactatctttgagcagtgttatacagtgagacgccatggaaggggtttatat +attttactgtcgttccctaaaaagttaattatcagacctgcgcgatctcgtagatgaaca +acgcgatctagtcgaaaaatgcttgtggctaccattccagtcgagatcaaccgtttctgc +ggatcgcgttacattccttgcttatttgcgataaatcgatacaaccccattaccagaaaa +acccggagaatcaattactctgcagatcttatactaaaaaagagattacaacccctgttc +tatgtgtcccaaagtgagtaacgtggagcgttggggtaagagcggagcgattttaacttt +cgcttttccattttccagtattgtactttacgttatatttgagcggcacattcgtcaaaa +catgatccatatggactgaggtgtttaaatgttaatcaaataattgtattttcagctgac +tttaaaatctgcagccattggaggtggagattccaatagatgtaagcaggtgatatcata +tgcaattcttgtgacttattaagataccagacacggcacaatcgcagtagcacgtaaaca +ataatgacaatcgacggttaaattccgaacgtaagatatgtttacggatgcactaaaata +ggtagcaacaacgtttctctgagatgtataagttaccaaacactggagaattccgctaaa +ctaaggacaatttccgtcgtattaattgttgacaaatggttagtaatacattcgcagtgg +ataatccgttgcatacctagcactgagtgtaaataaaaccaatcgactactggcatttcg +ggctaacgactagatgttagcctatgtgaaagcctcacacatgcttattgccttcacggt +gagcaatgtttcttattcgttattagaagtcacctgtagagacagtagagatgacctaaa +tttggtttgtccagtcccgaggtgatctaatgattaggttaacttagaacagtggtcaat +tggttaaagctgatttacgaacacttccgaggggtcgtaaaacattaaactggtgagaac +agtatgatgtattcggtcatctagacaaccccatcgctgggagtttggacagtgttatga +ttcgtaaatccaccatgtgtccgaattcgaaatcctgttgctccggggagatagggttaa +tttaggcttttttacggtgtggcatattagctcaaacatcaacattcttaaaatcagcgt +aaacggtcaccagttgatatttgttctgctaggaagcgatgtacaaaataagcttaataa +gatttaggtccgaccttaatttcggtccatagcacctctttctaagtgttttgcttaaat +aattgtattgttattgattttctgcgagttgaacacggaaaataagtcaaaaaggacact +tttaggttcatatgtaccgatgaatgcgcaatagaatcgagaaatttttagattagtaat +cgtgatgattgtggccaaatcccgcactaaacggctttcgctgtttccaaaaaattttag +tccactaggtatttaaatgttggacactgaacgtggaagccgtcgtattatgaaactaat +ggcagaggggctcctctgcgtgtactttgagcagatgctatcgtcagaaaaaggtaaatc +ttttggttctttataattctggcgtccgtgtagcctagtgaatgtgtttggttcaagtga +atttgtttagccagaatggaccaattacgtcattagctgttacgtctatacgaaatatag +actgtggacgacccatcgtagagtcatgtagttacatgtgaccttagaacaccaatcgtg +tgcgattgtaagcaggacaacacagtattgtactggtcaattggttcatagatctgacta +tgaatcttcgtttttgtacaacaatctcggtgaagcttcaaaaagcctccttcctaataa +tcagttaatttttcgtaaggttcctgttcgaggttagtcgtataaagacgaaacggcctt +aatgtaacattaactattccactgtaggtggatctaacaaggttggacatgtgctaccaa +taagataagaatttcgtccgcaatacaatatctacttttgtagcctatcttggattaaca +acaacttacgttggtatttcaccggacgtatcaaatgattctgattttaatgactgagag +taaacatcaacgaatcttatgtatctttaagccgctgcttgacaagtcacattactgtta +gaatgaacgcttcattactacaaaacctaccaccaactcccacattaatattatactaga +tgtttgaagtttatttgacaaaggttttcaaaaagcacagaatcgttacgaacacgtaca +ttaaattgttagggtattaattgtggtcggtgcatttccggccccatagcgctccgcggg +gagaaactatggccttcatgacagcccccccataacatctaggtaatggtcggataacta +taaacaaccctctccagagaactgtgaaaataaaatctcttagtacacaagcgtatactg +gtttaagtcttgcccatcttaaagactcttttcactattttcttgatgcctcattcttct +aatattaggtgattttttaatccgagaatataaaaagacgatagaaagtgttaaaacacg +gcgtagcgacatattttaaagaaatgaaatactttttgactatccctcatgatctaaact +tacgcggagctatctttttgtataacatgtacagagaattaatccgatgcttcttccgat +taaggacatagcgccgaaaacgtcatggcggcttatcgatatcgtaacgcactataccaa +gtgattaagtgatcaatgaatacgggtttcgggatttctgttaagtcatgcacggcaaat +acttggagtcttgaataacgccgcgcgtagtacgaaggttctcaagctcgcgtgacgtat +agaccgtattgctatttcctgccttctcaattgtccgaggattgctgataacttaaaata +aggttgagtttttaataacgatttgtcgagtttgggaaaatcctcgtttgtgtgtttgtc +attttcaagttatcaagaactacgggtataatttacgacgtaatgttggtttgatgcccg +attgcgaatatcgtacgaatggtatttgtacaactgctttcctttatcgattgctcgaga +acattataaagtctattactatggattaagactgtatacaagtgtttaagcggagcccgt +gataatctataaggttttggtacctttatctgttacttttgccttgaaacatacatacgt +acacgggaatatttacctaaacgccgtatagtccagcctcgtatttgggccgtgttttgt +cagcattttaaactgaaagcgcccacttgcattataacccggtgcggaatctcttagtga +ctcgtcaggagtttacgcctttgagacctctcgacaggacccattttgatctagtcgtta +taggtagagtgcctttcctatcgcaccattaccttctagcaaacttagagtattcaatga +aatcatatcctgtttatactaaatgttataggctaatgacacagctgacactaagaggtc +tcttcgggttacccgaatgagttgtttatacgatgttgacaactcgggggagtcatttca +atgaagactgaggactcttgatcagattaaaacgcttaatgactgataatttagattatg +ccgtgtattatttaagtgggcgaaccctcccctagaatgggtttcctgagaaaagtctta +gaacacagtattctgaatccagatgcaaatcgctaacgttagtaagcggctgtagctctt +ggcagtttggtcaatagtcaatcgcaatccgtttaaccgtctactattcctagagcgaag +agctatgttctgacacgtccccaatattaggcaaaggctccaaaagaacagtcaattgat +taactacgggcttggtttctccgtgaatccttgcgccgctataccacataaaaggatagc +ggtgataccacaagtttgcgacgttaaagcgtcgaccctcaacaagtacactagcaaccc +cttagcaattaattttgtccatcactactgccaagagttgactggaccagttggaaatga +catttgatatattaatagagctacatattgtaccactttactgtcacttacactaaccct +agcgtgattactcatacatatattcgtaaattctaagttatgatactagttttgtaaatt +taatcggcgaagacacgttctcttgtacgagcttcaactaaatatttcactgtagccaac +cactttaaccagaaggataccttaatgccgatataatattgtccaggaaacgttaatact +ttcacaagacaaagcttggaagaggtactttacgatcacctgatagatcgaccggaacga +ttctatataggtttggtctgagaaatttgtagctaaaaccatgttccataggaactcctc +tgtaatgggcaaaatgcagatagcgttcaatcgttgcttaactatctatcacagcatcct +aactcctcaacagcttctttcctaaagacatcagcaggtaagttgacggcacccgataac +ccagagcacgattggaatctaatactctgtatggatcattacgctaagtaaatataatga +ttttctgactcaaagttacactgcgaattttatattaactggttctatttgttaaatacc +acaacctctcgtcaacaggtcgcgatgcaagtgatccaaaaatatctaacttataccaac +cattacttctggcgcagaaaaacatagatatctgaacaatcgaccgttaagactgtctcg +ccgatcttaggaacctaatactgctcagtagttattgtttatttgggccatccccggatt +atgtcagccatggaacactaaaagtcctaatctaacctatggacaaaaagctcactttta +taaaattgctcaccttatgttgattgttatttgtccgaaatgtctataactcagtgtact +atctattggaaaattatggccggagttttattgaatatacttttgtatgttgagaaagaa +tgttgtcgtaataattatcagctggaaaatcatctaatatatattatattgagatattac +gacagacctaagtgctttcccgtcatgagcagatggactaacactcttggtaatccttct +cgttttagttggtaatgtttagtctaagtaatatcccgactcttacttactcagagcgga +aatgactttttaaactaacgtttaaaggcacttagtatgcgtcagggttatttttttaat +tacgtacccttgtgcagagagtttagctattcgatcctacttagtatgaaccatgagagt +acaggttggtaattcacagagaaggtcgagaagattatttttgatgtttaccaatactat +gaggcgtattcatcgaaataattttatggctgcgcacttcacatacgcaggaagaccact +gcagcttgctagatctggatgtatcattgtacttctaagagcctgaaaggtaatacattc +ccagcgagcgtaacagattgtatggggacatattcaatcttagcaatgcattcgttcttc +gaaatcaggcatttttgatgtcataagttctgtcaactataaccctggaactttaatctg +ttgttcgtcgaatcaaggatcaagaaagcttctaaaaggcccaaagcaaaacccaccact +acttcagttttaaattagaatcacaccctagggtattagataataattaaatgtcttagg +aagagatatcaaaagatgcagacatcctcaagtgaataagtctccggtctttcacaaaca +catggttaagcgatgtggttttgactagagacgttcgccaccatcgtaatatttctggtt +acctgcgaacgtgaaccaaatcttacttcatacattgcttaaacagtacaacttatctct +tatcctatagagatctcaaaagtttgtatttttactggtttcaaattgagagaaaaactg +cgttctccgatttctatattattgtttaaatgatgccaaacatccagtttaaaacacggt +gtgatcagccgactcagattcgtatcctatgttagaatgagtcatcaaactacggtcacg +cgtacattacagagtaaactacacgaatgaaagagataagaagatgaaagagttaatagg +tctcctgttaattatgagaaccctaactactacggattggcctactagtgggttggaacg +gatataaaattcgactaagttcgcggcatgtcaggctcctaaatatgaagagaactcggc +atcgaattatccacagtaatagttggaacatgattcctctatgcatggtgtatatccacg +tacgccagtgtgcagtgtagccatgcgaccacgggcgttgtgaatattcttcctcagaaa +aggactgttgagcaaggaattggattctgtgaacggaatatagtcgagtagatggaattt +cctacactgcgaaaaggtcatagtaaatcaaacgccgcgcgcagacatatcttcttggca +attagtactccactaaatcaattggttataaacttttagaatatctttatataagttcac +tacttacgctgcgggtagtatatttaaagtgatgtcttaggaatcttatggcggcggaat +aaacggcttgactatagataccctaattctggcataaccctgtaacgtgtgaagcatgct +ttaatagacgactagatcagcttatagaatggatatgactgccacattgaagagattaac +attagcgggtataatgttacgaacttgtttaacaaaatagctctaccacacacgcatagt +ataatataaaggtcctggagttcgctacgagcctggaattgcagttcccctaccctgagt +aaacaagatcagtatggacctatcttctgacccacgtgtaaaaactaccgttagcggccc +tgagaacggtgaagttgattatcggctaacactcgctttaccaaggaacaaacaattgat +ggaacaggtaagcggctggattctatcctgaatacagcataataatatttgctttcaata +tatagttatgacactcccaatatcactaactctttacaaatcggatatgaagagtgaatt +agagatggagccgatcgttccttgtattctggtaagtactcgactaatgtgtgtagtcta +ggggtaaaggtccttaaccgtcgagtctagaactcacgcattatgaaatcctccgagcat +agagactctaaattcgccaagcaataagtcccgacgcgaaggatgagaagctcattgaac +tgtaacatttacgtcgggctcaccatgttacatatgcagcgggtaaaagtttttgcctgg +agtggttgagtttcgcgatacataaaaggccccactttcatatggtcaaatatctatatc +gtgctttggacgactcgataaactaaagtagcctagtaatgccctaaaccgctgcatttg +tgcaataaaaaatttagagtatatataacttccggacgtatggctgccttgaatcctcgg +atatcgtccttatacaacgatgaacggtatagctcggaactatgcagattaggcgatcct +tgggttgaatttttagtttccatagatatgagttagttttgatatggttaccatacgtcc +ctgcattgaaacttaatctgtatattgattgatccttagcaatagcggcacatttctggg +caatatgacttaattaggttacggtttttactatgatggatacgttttatatgatagaat +aacagttgctatttaaacaggtactacattcaactaatactgtttcactattgtgtccaa +catagggaatatattgcctgaatagatgtattatcaggcatcttttacgctccaggtaga +actaattaaaaatgatccttagaaactttcaagcaacataagctaaaagttacgccaatt +ataagccacatcggtaggatcttcaggcattcccatatccttctctatcaatcccgtctg +ttgctaattggttatctaagcatatcgcggcgagcatctacgataggtataaagttgctg +ctatctaattcgtcataatatatacatggaattacagattcatacgtcttcagtctcgtg +gtgtttctaagagcggacccaagaattacgtaatatctctctcgtgttacccaagaagtt +gacacgtgattgtcagctatctttttctggcgatgttaatagttataaacaattgcatat +agctgcaaattagctaatcaaatactcgtttcttaaatgttatcagcaaagctttaggtt +ctgtaatttcactgtgtaaagagggcgctaagttcaaaattggtttttggcaacaaacaa +tttaatagcgcagtgcaaaaataatatctcagggtgtaattatttctctaattggtcttt +acggttggaccaggcaatgggttttttatctatgtgataccaattaaaagtaatttcaaa +gtgacattaaacttaagtattgctgtcaagaccattacgacacttcaccaacacatttat +gtattgtgctacgcggtatggcccgtagtaatttctgatattgaccgcgttatcagcaag +tacgctgtacaaatgccaaatttagtaaagctctgtgtgcattccaaggtgcccacatca +cacattatcaacatatcatgtcgttgtattacgtccttttactagcctgggaaataccgg +tgattcagagtgaacataaatctctgaaagctactagacaaagctagtatagttaaaata +tatatttcttttaatattaggatctttgcgattgcacatttcaagcatcgcattaaccta +cctccgtactcttctacaacggttgcatgtacgatttctatgcgatgaaatacttatgtt +cttagtttggggttactttgttcacctagtcctcgaacgcaaattagcttcgaatatctg +aaaagtgtatgcgggcaccaaaacgatctcgattcttaggtttataattatagtcagaag +ataaatacatgcatatctggacactcttccacatgtcatgtcgactaactttgaactaca +gtcatatatagactgttatctgatccgtatgtgtctattactactcttatctgagaaagg +acccaatggagtcacagtaagcgatcatgtcatcggggctttttccctgattataagatt +acactattgctgtgcttggggcctcctactttttctatcttaatcattttgtacattaaa +aagctaagaagtaggtacaacttatctttcccatacgagctggaccattaatttaacagc +cgcaaggcgagttttaatgttaatctggaagggctttatgttctaagcttttagcactga +gaaattaatccgtaggaaattaatcccacataacccggtaagagaaccttacgccccgtt +actaataatgttctgcgcaatgtaggaagtgacaagctcactcttgcgacgagctcctta +atacaggccctgcgttatattcgaccgtacctataactagaccaccatcttaaatgtaca +gttatggttttcgacgcatagagtatgggaccacctcgaaatgctcagctgcaaattgta +ctgggggtggttatcaaacatttaatatgaatctatggtaaagtactagtttatagatag +ccgaacactaaaggtttgcagaccttcctcccctgaggaacttcgtgtcacaaattagat +tgagaaggtggtgataaaatcgcgtatctacaatgatttggtgcaaatatttatcgattg +cccaatcgttctactcgtactctttatagcctaacgccttttcttggcgctaattagcct +aatccaagaaggagtctaacaaaattacttaaccatactcttgtctattcggcccacgca +tgcgcaagctcaaaaagttctcaacgggcgtttttacttgagtcccaggaggtaacattg +gatctatgagtcttaacagtggaaatatgatttttagattgtgttcagatttattgtctt +attttggtctatctcatcagctatagctacataatgacgtcttaactgtttcgactaacc +ttcagatctgactaccccaaatacaacatagcaaaagaatgatgctaacgcttaactatc +ctttcacgatcttaacaaaaaagctccatttaaaagaatcgaaaacagatctaccattcg +tggaatcaatttttggacgagtactggtcgggtcgtgcttatttgctacaggattgtttc +gtataacgttcaagcactttagcggttccatccttgatggcgttaactgatgatgcgtaa +gtttatggtgatctaaaactctactacgaaccaggtcccagcacgaaacgtcatctttaa +tgagtttttaggtctccaggcactaggctgcgaagtggaatatgtgtcatcagagacaaa +tagatgattcctatagctttttgcagttaagccactaagtaggcggttctatagggtttc +attcaaatcgatcgtaattcccgactctgcatagcgtgggtcttgtatagaccattcttc +aggcccgccacaatggtttcaagtttcaacttccgtttattggctgtccctcaatagagt +cgttctcagggcacgactctcgttcgttattcataagtccagtttgatccacgaatacag +aacacgcatatctgataataaaagcttaacgataactttcacgcgcatggtttatttttg +atttattaggcaaccaaataccagaatgtagtcagcgatatgtagtaaaatttagacaaa +cataaaacaaagtatcgccattacagtctcctgttaggagaacctttttatcaatatgtg +taggcgtgtattggcgcccttgatttaataataattacggctaaacgtattgatattttc +caggaactgccccatctcatgagatgaccctaaattttattcacacctcatttttaattc +ttttatatcacgattatttatctgagcaagcatctttgcaagcattcatagtgacggtgc +tgtctctatgaatgcatgctaatatacggtgcgctaaacatattggttcaattcaatgta +agctacctcggaatttgcttgcactaagacggggaagccaaaacggtaaatcgccgtata +tgctagtgccaagggacttgtccgttggagtcactatggagttacaagcattataaatct +aaggaaatcgcagtatcagtccttaccccaaagatacttcgcattccctggggtacggac +catgaaatacttctttcatacatgataaacgatggagactcggttaccaccctggtagtt +actccatcaattggagttaactaagatcgctattacaggctttattagccaatcatcaca +agcctctttttagagattcacaagttagcaaaccaaagttcctttgataagtctttaacg +agatctatcccaattccggctaggagtaaaatttatatatttgagatcggggttaaagtc +acacgcaatgcaaggggtttttatatggtaatgtccttccctaattaggtaattttcaga +cctccgagagagagtagatcaacaacgcgttatactcctaaaatgcttgtcgataacatg +acactacagatcatccctggatgagcatcgactttcattacttgattagttcagttaatt +cgtttcaaaccattttcaacaaaatcccccagtagatatgtatatgcacatcttagacta +aataacagttttcataccctgggatttgtgtcactatctcaggaacgtcgagacgtcccc +tatcaccgcagcgagggtaactggccctgttccattgtaatcgatgggacgggacgttat +attgcagacccaaagtagtaataaattcagccatatggacggagggggggaattgttaag +aatataattcgattttcagctgaatgtaaaagctccagccattcctcctccacttgacat +tagttcgaagaaggtctgagaattggaattgcttgtgacgttttttgtttccagacaagg +aaatagcccagtaccaagtataatattatgacaatagaagcttaaattcacaacgtaaca +tatctgttagcatgctctaatagaccgagaaaataagtgtctatgtgtgcgagaactgtc +aattcacggcagtagtcacctaatctaacgtctagttcccgactatgaagtcttcacaaa +tggttagtaataatttcccagtggagtagaagtggcataacgtgcactctctgttaataa +tacctttagactactcccatttcgccagaacgtcttgatggtaccctatgggaaacactc +acacatgcttattgcctgcaacctcagcaatgtgtcgtatgcggtatttctacgaacagc +tagtgaaaggactgatgacctaattttggtttctcaagtccagacgtgatattttgatga +ccgtatctgacatctctgggcaattcggttaacctctggtacgaaatagtccgtcgcgta +ggtaaaaatgataatgctgtcatcactatcatgttttagctaagctacactaccccatcg +ctcgcacgtggcaaagtgtgaggattccgatatcatccatgtgtacgaattcctaatact +cttgctcagggcacttagggttattgtagcctgtgttaccgtctcgcatattagatcatt +aatcaacagtcttataatcaccgtaatcggtaaacagttgttatttgttctgataggtag +acagctaataaagatgctgttgaacagttacgtcccacctttattgccctacagtgaaac +tagttcttactctgttgctgtaatatgtctagggttattgatttgctgccacttcaaaac +ggaaattaagtcattaacgaaaatggttccttcataggtaaagatcaatccccaattgaa +gccagaaattttgagatgtcgattcctgatcattcgccaaatttacagctcgtaaacgag +ttccatgtgtaaaaaaatgttgagtccactagcttgtttattctggctcaaggtacgtgg +aacacgtagtattttgatactaatgccagacccgctacgatccctgtactgtgagcagag +ccgatcctcagaaatagctaaatcttgtgcttcgttagaagtctcgactacgtgtagcct +agtgtttgtgttgcgttatagtctatttgtggacacagtatggtcaaatgacgtcttttg +atctgacggcgttaacaaagatactctgggcaacacacatacttctctcatgttgtttct +tcggacctttcataacctttcctggcacatggttagctgcacatcacaggattgtaaggg +tctagtggttcagtgagcggaatatcattcgtcggtggtgttaatctatctcggtgtagc +ttataaatgcatccgtaagaatattatgtttatttgtcggtacgttcatggtagtggtgt +cgccgatttagacgtaaaggcatgtatggatcttgatctatgcaaaggtaggtccatcta +tatacgttgcacagcggatacaaataagataagaatttactaacatttaaattttcttat +tgtcgagcatagattggaggaaaaacttatttacttggtatttaaacggaagtttctaat +gtttatgattggatgcacggacagtttactgcttactttcttaggtttcttgaacaacag +gatgcactagtaacatgtctcgttcatgcttccattaagttcttcttaaacttacacaaa +ctacctaatttagagttgacgagatggttgaacgtgttgtgacaaacgtttgcaaaatgc +acagtatcgttaccaaaaagtacatttaagtgtgtgcgtaggaattctgctacgtccatt +gcaggccacattcacatcccacccctgaatatatggactgaatcacacacaccaaatttc +atctaccttatcgtagcataactattaacaaacatatacagacttcgcggtaaataaaat +atattagtacacaaccgtatactggttgaactattgcccagctttaagacgcttttaact +aggtgcttgatcaagaagtattattatatgacggcagtgtgtaatacctgaatagatata +gacgttagattgtctgaaaacacgccgtagagacatttttgttagatatgtatttctttt +tgacgagccagcatcttagtatctgaagacgagctatatgtttgtagaaaatcgactgac +attgtatacgaggcggcgtaagattaaccaaattccccagaattagtaatggcgccttat +cgatttactaacgatatataacttgtgatgttgtctgcaatgtatacccgtgtaggctgt +gctcttatcgaaggaaacgcattgaagtccaggctggatgaaaccaccgcgtacttccat +gcgtctatacatagcgtcaccgatactacgttttgctatgtaatccattctaatgggtaa +gaggattcctcttatagtaaaatatgcttgactttttaagaaccattgggagtggttggc +aaaataatagtgggtgtctttctcagtgtatagttttctacaactacccctattaggtta +caagtaatctggctttcttgccacttggcgatgatagttagattcgtatttctacaacgc +agttactgtatccatggcgcgagataattagatacgatttgaatttggatgtagactcgt +tactactgttgtagaccagcacgtgagtatctagatgggtttgctaccttgttagcggac +ttttgccgggaaaaagacatacgtacaaccgtatattttactataagcagtattggccac +cctcgtattgcggcagggtgtgctcacctggttaaaatgaaagagaaaaattccatttta +aaacccggaggaatctattactgacgaggaaggtgtttaacccgttgagacatctcctaa +cgtaaaaggttcatattctagttattccgagagtcactttcctatccaaacatgaactga +tagcataatgacaggttgaatggaaagcatatcctgtttattctaaatctgtttcgctaa +tcaatatgctgtcacgaactcggagcttacccttacaactatgtgttctgtttaccaggt +gctaatatcccggcactcttttcatgcatgtcgctcctagcgtcatctgatttaatagct +taatgtctcatattttacagtagccagtgtagtatggaaggcggcgaaccagcccctaca +ttgggtttcctgacataagtattacatatcacttgtctgattacacagcaaaatcgctaa +ccttactttgcgcatgtagctattggaactttgggctagtgtctatcccattaagtttaa +cagtagactagtccgtgagcgatcaccgagcttatgtctcgtacccaagttttggatttg +gatcaaaaactactcgatattcatgatctacgggcttcctttctccgggtatcattgcgc +cgagattaaaaataaaacgatagcgctgtgaaaacatgtttgacacgggatagcgtagaa +actaaacaacgaatagaccatccaatttgaattttattgggtccagcacttcgccatagt +gttgaatggtaaagttcgaaaggaaatttgttatattaattctgctacattttcgaccac +ttgtatctcaaggacaatatcccttgaggcttttagcagaaagagatgccgtaattctaa +gggatgataataggttgggaaatttaagagcagtagtaacggtcgcgggttcgaccttaa +actatatatttaaatctagccaaacaagttaacaacaaccataaagttatgaccttatta +tattggcaagcttaacgttttaattgctctagtaatagagtggtagaggtaagggaccat +cacctgattcttcctccgcaaccattatatagacgtgtcgtctgacaaatttcgagataa +aacattcgtccttagcaacgaatatcgaatggcaattagccacattgagttaaatagttg +aggatatttcttgcacagaatcagatctaatctaatgattcgttactaaacacttcacca +ggtatcgtgaaggctcaagattacccagagaacctttgcaatataagaatatgtatgcag +cattaccctaagtaattatattctttttctgactcaaagtgacaagccctagtgtatatt +aaatcggtatatttgggaaattcctcaaactatcctaatcaggtagccatgaaagtgatc +aaaaaagttcgtacttataccatacatgaattctggccaagtaaaaaatagattgcgcaa +aattcgtaccttaagtctctcgccaagatattaggatcctattactcatatcgtgttttt +ctttattgccgccatccccggagtatctcacccatccttctcttaaaggcctaatattac +ctatgcaaataaacatatattgttgaaaattgagaacctgatcgtgattcttatgtgtac +catatgtatagtaatcacgcgactatatagtgctttagtatcgcccgtgggtgagtgaat +attctgggctagcgtgagatagtttcttgtcctaatatttttcagatcgaatagcttcta +tttttgtgtttattgacatatgtcgaaactccttactcagtgaaagtcatgaccagatcc +acgaacaatcttcggaatcagtctcgttttacggcggaatcttgagtctaacttatatcc +cgtcgcttactttctaacaccccttatgtatttttaaaattacgtttattcgaacgtact +tggcggaagcgttattttttgaagtaagttacattgggcagactcttgacattttcgata +cgactttctttcatccatcacaggactcgttcgtattgatatcagaagctcgtgatgatt +agttgtcttctttaccaatactttgaggcctattctgcgaaatttttgttgccctgcgaa +cttcacataccaaggaacacctcgcaacatgccttcatatccatcgttcattgtaattct +tacacaatgaatcctaagtaattacatccctgcgtaaaagatggtaggggcactgaggat +atattaccaagcatttagttatgagtaatcagcaatgtttcttgtattaagttctctaaa +atagttacatcgtaatgttatctcgggttccgcgaataaacgagatagattcattatata +tggccctaagcaaaaacctcctcgtattctgttggtaattagaatcacacaatacgggtt +gagatattaattatttgtagtacgaagagatataaaaagatgaacaattactcaagtcaa +gatgtatacgggatttataataaaaatcgggtagagatctgctttgcaattcagacgtgc +cactaaatcgtaatatgtcgcgttacatcagaaagggtaactattattaattaataaagg +gcttaatcactacatattagatcttatccgatagtcttatctattcgttgtatttttaag +cggttctaattcagtcattatatcagtgctccgagttctttattattgttttaaggatga +caaaatgcctcttgttataacgctgggagaagcagactaagagtcggagcagttggtaga +atgaggctgcaaaagacggtctcgacgaatggacagactttactaaaccaatgaaagaca +gaagtagagcaaagtctgaagtggtatcagcttaattatgacaacccttaatacttccct +ttcgccgaatactggcgtggaaaggttttaaaagtcgaagtagttagaggcatctctcgc +tcataaataggtagactactcgcaatccaatgtgactatgtaatactgggaacatcagtc +cgcgatgcagcgtgtttatcaaccgtccccactcgcctggggagacatgagaccaccccc +gtggggattattagtccgcagtaatcgactcttgacaatccttttcgattatgtcatagc +aatttacgacagttcagcgaagtgactactcggcgaaatggtattactaaagcattcgaa +cccacatgaatgtgattcttggcaatttctaatccactaaagcttttccgttgaatctgg +ttgtagatatttatataagttcactaattaagatcacggtagtatattgatagtgatgtc +tttgcaagaggttggccgaggaatttacggattctctattgatacaatttgtctggctta +taactcttaaggctgaaccaggcgtttttagacgacttgatcagctgttagaatggtttg +gactccctctttcatgtcagtaacatttcagccgttattgttacgatatgcttgaacaat +attgatctaccacacacccatagtatattttataggtcatgctgttacctacgagcatgg +tattccacttcccattcaatgagtattcaacatcactagcctcagagatgatgacccacc +tctaataacgtcacgttgcggccatgtgaaacctgaacttgagtagacgatatcaagcgc +tttaaattgcatataacatttgagggtaaagctaagcggatgctttatataatcaatact +caataataagatttgattgcattttagagttatgacacgacatagttcactaacgagtta +ctattcccagatctagactgaagtactgatcgagacgatccttacgtcgatgatcgttag +ttatcgacttaggtcgggtctctagcggtattggtacttaaccggacactatactaataa +cccatgatcaaagcataacagaatacagacgataatttcgccaacatatatgtacagacc +ccaagcatgagaagctcattgaaagctatcattgaagtcccgctcacaatgtgtcttttc +cagacggtttaactggttcccgggagtcctggagtttcgacttacataaatggaaacaat +gtattttgctaatttatctatagcgtcatttggaccaatacagaatattatgttgcctag +taatccactataacccgcaagtgctgatagaaaatttttagacgatttataaatgcccca +agtatccctcccgtgaatcctccgttatactaattagtattcgttcatacgtataccgcg +catatatgaacatttggcgataaggcgcgtgaattgttacgtgacagagatagcagtttc +ttgtgatatggttaacagacgtacatgaagggaaactttatatctatagtgatgcttccg +tagaaataccgccactggtctgccaatgatgaagtatgtagctttaggtttgtactatga +ggctttcgtttgtttgcagagtataacagttgcgagtgaaaaaccgacgaatttatacta +atacgctttcactattggctacaaaatagggaagagtttcaatcatgagagggagtatat +ggatgctttgtagctaaaggtagaacgtatgtatatgctgccgttcattcttgaaagata +cataagcgataagttacgacaattataagcaacatccctaccttcgtaacgatttcactg +ttactgcgcttgaaatacactatggggctattggcggagagaagcagatcgcgccgagca +tatacgagacctataatgttgatgatagagaaggcgtctgaattgatacatcgaagtaca +ctttctttcgtagtatctctcgtcctctttctatctccggacacaagaattaagttatat +atatagagtcttaccaatcatgttgaatcctgattctcagagttctttggcgggccttgt +gatgactgagaaacaatgcaatattgctccaaatttcctaagcaaattctcggttatgtt +atgttatcagcaaagcgttacgttatgttatttaaatctggaatgacggagcgaagttct +tatgtcggtgtgggaataattcttttgaagacagcactccttaaataatatcgctccgtg +tttgtatttatcgaatgggtctgtaaccttgcacaagcaaatcggtggtgtatatatcgg +ataacaattaatacgatgttcatagtgacagtatactgatcgagtcctctaaagtcaatt +acctcacttaacaatctcattgatgttgtgtcattcccggtatcgcccgtagtatgtgct +ctgattgaccgagtgtgaaccaaggaacatctactaatgcctttgttaggtaagatctct +ctgaattccttcgtgccaacttaaaacattatcaaaatttcttctacttggattaactac +ttttacgagcatggcaaattcccctgtggaagacggttcattattatcggaaaccttata +gaaattgcgtgttgactgaaattagatttttattgtaagagttgcatctttgcgattcct +ctggtctagcttccaatgaacagtcctcccttctattcgacatcgggtccttcgtacatg +tctttgcgatgtaataattaggttcggagtgtggccttaatgggtgcaactaggaataca +acgcaaatttgctgacatgatagcaaatcggtatgccggcaccaaaacgtgctccttgct +tagcttgtgaatgagactcagtagttaaataaatccatatctgcaatcgattccacaggt +attgtccactatctttgaactactctaagagatacaagcttagctgagaccgaggtgtat +atgactacgctgatatctgtaaggtaccaatgcaggcaaagtatgcgagaagctaatacc +ggctgtttccagctttataagattaaaatttggctgtcctggcggcctcagaattgttct +atcgtaatcagttggttcattaattagctaagtacgaggtacaacttatctgtcccagaa +cagctccacaagtttttttacagccgaaacccctgtgtgaatcttaatatccaagcgcgt +tatctgattagagtttacaactcagtattttatcagtacgttttgtttccaacattaccc +ggtatgacaaaatgacgccacgtgtcgaataatggtctgaccaatgtaggaagtgaaaag +ataaatattgcctacacatactgaattcaggcaatgcgttttattcgaaaggtcatataa +ctagaaaacatgatgaattcttatcggatccttttactagcatagtgttggcgaacacct +cgtaatgctcagcggcaaattggactgcgggtccttatcatacattttttttcaatatag +gcgattggtctaggttagtgattccccaacacttaaggtttgctgacattcataccctca +gcaacttcctctcaaaaattagagtgagttggtggtcttataagaccgttgattatttga +ggtggtcaaatgatggtgcgatgcacaaatcgttataatcgtactctgtagacaataacc +cattgtagtgccgattttgtgcataatacaagaaggaggatataaaaatgacttttcaat +aatattggctattagcaacaagaaggagaatcctcattaagttagcaaccgcagggggta +ctgcagtccaaggaggtttcattggagagagcagtatgaaaacggcaattatgattgtga +gattcgctgaagattgtgtctctgattttcctagatagaataagctatagctacttaatc +aactcttaactgtggagactatcctgatgatctgaataccccatttacaaaattccatat +caatgaggctaacgcttaaatttcatttctccatcgtaacaaaaatcagcctttttatac +aagacaaaacactgcttccattacgggtagcaatggttgctcgactactggtagcgtcgt +gatgtggtgataaagctgtcttgcgtttatacttaaacaaattttgacctgacataatgg +agcgacttatcggatgttgccgatctttagggtcatctattaagcttatacgaaaaaggg +acaagcacgttacgtaatctggtaggactgggtacctagaaacgcaagaggaggcgaact +ccaatatctgtaagaacagaaaaatacaggagtccttttcatttttcaagttaacaatat +aagtaggagcttagagaggcttgcatgaaaatcgttaggaattacagaataggcagagag +tggggcgtgtagactacattcttcaggccccacaatatgggttataggttaaactgcact +ttttgcgatctcccgaaatactgtcgttctctgcgaaccacgctcgttccttttgctgta +gtccacgttcatccaactattcagataaacaagatcgcagaattaaagcttaaccatatc +ttgatagcccatcgtgtatggggcatgtatgtgcaaacaaaagacctcaatcttgtctgc +gagagggaggaaaatttagacaaacataattcattctttcgactggacacgctaaggttt +ggacaaactttgtatctatatctggaggcctgtattccagcccttcttttaataagattt +acggcttaaactatggatatttgccaggaaatgacactgctattgacaggaacataattt +tgattcaaacctcattgttaattattttatatctcctgtttttatatcagaatgcttctg +tcctagaaggcatactcaaggtgagggctcgaggaatgaatcataatagaccggccccta +ttaatattggttcaattctttcttacataacgcggaatttgattgcacgaacaccgggaa +cacataaccgtatagcgcccgttatgctagtgcctagcgactgggaccgtggagtctata +tcgtctttctaccattattaatctaaggatataccactttaagtcctttcaactaacata +aggcgcattccatgcgctaaggaccttgaatttattatttcttacatgataaaagatcga +gtcgacgggaacaaaaggctacgtactcaataaagtgcagtttactaagagccctttttc +tggcttgtggagactatcataacatgaagatgttttgacattcaatagtttgcaaaacaa +acttactttgtgtagtattgaacgagatctttccaattgccccatagcaggaatagttat +atattgcagatcgcggtgtaacgcactccaaatccatcgcggtgtgtgagggtaagcgac +ttaaagaattacggtttttgatcaaagcacagtgagagttgagcaaattacagttatacg +acttaattcagtctccataaattgaaacgacacttcttaacgggaggaccagacacgttc +attaagtgaggagtgcactttttgactttaaaaacatggtaatcaatttaaaccacttga +tatgtatatgaacagatttgaagttatttctgttttaatacactgggagttctgtcaata +tcgcaggaaccgcctgacgtcccctatcacacctcagagggtaaagggacaggggaaagg +gtaatcgaggggtagggaacgtagttggcacacccaatggacgaataaatgctgccatat +ccacggagggcgggattgcggttgattttaaggcgatggtaacctgaatgtaatagatca +tcaaatgcctcctccactggaaattactgcgtacatccgctgagaattgcaatggagtgt +ctcggtttttctttaaacaaaaccaaattgacaacttcatagtataatttttgcacatta +caagcgttaattaacaaacttactttgctgttagctgcctatatttgtccgacaatataa +ctggatatctctgcgagaactgtaaattaacggcacttggaacataatagttcctattgg +taacgacgttgtaggcggcaattatccggtggaagaattgacaactgcagttgaactgca +tgaaagtcaaatctctcgtaagtataactttagaagactccaaggtacccagaacctctt +cagcggacacgatcgctatcaatcaataaggattattcactgaaaccgctcatatctgga +ggtggacgtttttcttcgaaaagcttgtcaaaggactcatcaaatttttggccgtgctaa +tcgacacacctgttattttcatgaccggataggacatctcgcggaaattcgggtaacagc +tgggtagatataggacctcccctacgtattaatgataagcctgtcataactagcttggtt +taccgaagagacaataaacattcgagcgctcgtgccaaactcggtgcattacgtttgaat +aaatcggtaacatgtactattactctgcctaacggcacttacccgtttgggtccatgggg +taaccgctcgatgttgacagaattatgctaaagtcgtttaagatcccgattaccgaaaat +ctggttatgtctgagcattcgtacactgcgtattaagatcaggttgaacaggttcctaac +aaattttgtgacctaaagtgaaactaggtcgtactctgggcatgttttatgtcgtggcgt +atgcatgtgctgacacttctaaaaccaaattaaggctttatccaatatgggtccttaagt +gctaaacatcattcacaatttcaagacagattgttggtcttgtcgattccgcatctgtcg +ccaaattgacacatcgtaaaccaggtacatcggtaattatatgttgactaaactaccgtg +tgtattctggctctaggtacggcgaacaagtacgatgtgcttaagaagccctcaccccag +acgagcccgcgtaggtcacatcagcagatcctaagtaattccgttttattgtcctgaggg +agtaggatcgacgaactctacaagtcgctttgtcgtgccttataggctatttcgggtcaa +tgtagcgtcaaatgaactattgtcatctgtacgagttaactaagtgtctatcgccaacta +aaagacgtctcgatggttctttatgcggacctgtcatatcattgactggcacttgcttac +atccaaataacacgtttgttagcggatagtcgttaagtgtgcgcaagatcatgaggcggg +gggggtaatatttcgccctctacatgataaatgaataagtaagaagatgatctttttgtg +gcggtaccttaagcgtactcctgtcgacgagttactactaaaggaatgtagggttctgga +tctatgaaaagcgacctccatatatatacgggcctaagcggagtaaaataagtgatcaat +ggactaacattgaaatgttagtattgtcgaccattgagggctggtaaatcttatttacgg +gcgtgggaaaacgaacgtgatatggtttagcatgggatgcaagcactcgttaatgcttac +tttagttggttgcgggaacaacaggaggctatactaactggtagcgttcttgcttccatt +atgttattattataattaaaaataagacatatggtagagttgtagtcagggtggatcggg +ttgtctataacgttggaataatcaaaactatcgttaacaaaaacgaaatttaagtcggtg +cggtggaatgcgcctacctcatgtgcaccacacattcacagcacacccctcattataggc +aaggaagcaaacaaaaaaaagttaatcgaccgtatccgaccttaaattttaaaataaata +gaaacacttagcggtaatgaaaagataggactaaaattcactagtatcctggaacgaggc +aacagagttatctagatggtaacgaggtgctgcatcaagatgtatgatttttggtccgct +gtgtggaatacctctattgatatacaagtgactttctcggtaataacgcacttcacaatg +tgttgtttcttttctatgtattttgcaagagaaagaagcttagtataggtacacctcaga +gatgtttcgtgtaaatcgtatcacatggtataactgcaggaggaacattatccaaattca +ccacaattactaatccacccttttacttttactaaagatatattaattctcatgttgtct +gaattgtataacccggtaccctgggagcgtatcgaaggataccaattgaagtcctcgagg +catgttacaacacacgacttccttccgtctattcagacactcaacgagactaacttttcc +taggtaatcaatgatattgggtaactcgtggcatcttatagttattgatccggctctttt +gtagatcctgtgcgactcgtgcgctaattaagactggctctcttgcgcaggggatacgtt +tattctacgtacccgatttggttactactaagcggcctttcttcaaacttgcagttgtga +cttacattcctatttcttcaaagcagggaagggttacagggagagacttattgagatacg +attggaatttccatgtacaatcgttaatacgcttgtagaccagcaactcagtatagagat +ccgtttcctaaagggtgagcggtaggggcaaggcaataagaaattactaaaaccctagtt +gttaatataagaacgattcgaaacaataggattgcccaagggggtgcgaacatggtgtaa +atcaaagagaaataggcattgttaaaacccgcacgtttctagtacgcaagaggaacgtcg +gtaaccagttctcaaagatcctaacctaaaaggggcttattctactttttccgacactca +atggacgagacaaacatgaacggatagctttaggtctcgttgaatgcaaagaatagaatc +gttattattaatcggtttccattatctatatgcggtatagatctccgagaggaccctgta +aactagctctgcggtttaactggtgctaatagaccgccactatgttattgcttctagctc +ctagcgtcttatcatgttatacattaatgtcgcatattggacagtagccaggcttggatg +gatcgccgacaaaaagaaaagactttccctgtaaggacttaactattacatataacttgg +atcattaatctgcaaattagagtaacggtctttcaccagcttcatattccaacgtggcgc +tagtcgatatcccatgaagtttaaaactagaattggcagtctcacttcacagtgcgtatc +tatacgacaaaagtggtcgatttgcataaatatcttatcgatattcaggttattaccgat +tccttgctaacgctagaagtcacaccagagtaataataattccagacacctgtgaaataa +tcggtcactacggatagactagtaacgataatacgtatagtccataaaagttgaatttta +ggggctaaagatattagcaatactggtctagcctaatcgtcgatagcaaagggctgtgag +gatttctcctacattttcgaccaattgtatcgataggaatagttacagtcacgcttgtag +atgtaagagatgacgttattcttagggttcttaagtcggggggtaatttaagaccactag +taaaggtagaggcgtacacagtaaacgatattttgaaatcgtcaaaaaaaagtttacaac +atcctttaagttagcaactgattttagtggcaaccttaacggttgaattgatctactaat +acaggcctacaccgaagggtacagataatgattcttactaccctaacatgatagagtcct +gtcctatctcataggtcgacattttaaattcgtaatgagcaacgaagatcgtttcccaat +ttgcaacattcacttatagacttcaggttatttcgtgctaacattaagatagaatataat +cagtcgttaagaaactattatccagctttcgtcaaccataaagattaaaaactgaaactt +ggcaagatatgaatagctatcctgctttaaccgatcgtatgagatgctttgtagcaagaa +aagtgactagcacttgtgtttagtaaagcgggagagtgcggtaattaatattaatatact +attaagctacacagcaaaggctgcaataatgttagtaagtagaacataaaggtattctcc +acaagtaataaatagtgtgagctaattgactaacttaactctcgcgacaagtgatgtgga +taagatgactcatatcgtctttttctgtagtgccgacatcccacctggatcgaacaattc +cttctagttatcgactttgattacctatcctattaaacagatagggttgtaaagtcagaa +aatgatcggcttgcgttggtctaccatagctagagttagaacgcgtagatagaggccttt +tgttgccaacgtgggggtgggatgagtctgggcgagcgtgactttctttcgtgtccgaat +ttgtttaacatccattagattagatgtttgtgttttgggtctgatgtcctaactactttc +tcagtgaaactaatgtcatcatccaagtaaaatagtccgatgaagtctccgttttcggcc +gaagcttgtctataacgtatataaagtcgctgaatttagaacacaccttatctatgttgt +aaagttactttattccaaaggacgtgcacgaagcgtgagtgtgggaaggaacttaaagtc +ggatcactcttgtcagtgtagataagaatttctttcatacttcactggaatccggcgtat +ggatatctctaccgcgtcatctggtggtgtctgcggtaaaaagtcttgctgcacgagtct +gagaaatttttggtgccatcacatcgtaactgtacaacgaacaaatagcatcaggccttc +ttatccagcgtgaagtctaattatttcacaagctttcctaagtatgtaaatccctcactt +aatgatgcttgcgccaatgaggatagaggacattgcatgtacgtaggactattctccaag +gggtcttctattttgttagcgaaaattgttacagcctaatgttagagcggcgtacgactt +tataccagatactttcattagatatgcaaatatccaattaaatcatagtagtatcgtggt +atggacaatcaaaaaagacccgttgtgatatgatgtttttctagttcgttctcatatata +tagatcaacaatgaataatctcatgatctataaccgatgtatatttatattccggttgac +tgctccggtgcaattcactacggacactaatgactaatatggcgcctttcatcagaaacg +ctaaatatgattaatgaattaagggagtattatctaattattagagagtagcagttagtc +tgatattttcggtgtatgtgttagccgttataatgctgtctttttatcagtgagaacagg +gagtgtgtagtgttgtatgcttcactttatgactctggttatatccctcggagaacaaga +ataagagtacgagaagttcggtcattgaggatgaaatagaaccgctagacgaatggactc +acgtttataaaactatgtatcacagtactacagctaactctgaagtccgagaagcttttg +taggacaaaacgttataagtacctttcgcagaatacggccgtgcatacctgttataaggc +gtagtagggacaccatgctatccctcatatagagctacactaataccattacatggtgac +tatcgtttacggccatcatctgtaagcgatcatgcctcgttagcatccgtacaatctcgc +atggcgtcactgcagaaaaaccccgtgcggattttgagtcagaactattcgaagcttctc +aatccttttccattatggcatagcaagtgacgactcgtcagccatgggaataatagcact +aatccgattacttatgaattagaacccacatgaatgtgattctgcgaattgtctaagaat +ctaatgattttccggtgaatatggttgttgttatttattgaacttatattattaacatca +cccttcgttagtgatagtcagctatttccaagaggttccccgagcatttttaccattctc +tagtcatacaagttggagcgcttttaaatctttaggctgatcaaggcgttttgtctagaa +ttctgcagatgttagattcgtgtgcaatccctcttgcatgtcagtaacaggtcacccgtt +tttcgttacatatgctggtaaaatattcatagtaataactacaatacttgatttgttacg +taatgctcgtacataacacaatcgtattccacggaacagtaaagctctattattctgatc +gagcctaagagaggatcacactacgctattaaagtcacgttcacgaaatctcaaacctca +actgctggtgaccagttatagacagtgtaattccatattacatgtcaggcttaagctaac +ccgagcctttatataagctataatcaagaattagattggagtgcattttagacttatcta +tcgaaatagtgatagtaagagtttatatgacctgatctagactgatgttctcttccacaa +cagccttaaggcgtggagcctttcttatactattaggtcgcgtcgagagccctattcgta +atgttaacgacactagactaatatacaatgagctaagaataacacaagtcacaagataat +ttacaaatcatatatctacagtccacaaccatcactagcgattgcaaagcgttattggta +ctaccgctctaaatcggtatgtgcaagacgcgttaactggttcaagcctctcctgctcgt +gagactgaaagaaatcgaaaatatggatgtgcctaattgttcttgtgagtcatgtgcaac +tatacagtttagtttggtcaagactatgcaactattaacagcatgtgcgcattgaatatt +tggtgtcgattgataaatgccccaacgttccatcacgtctataagccgtgttactaatgt +gtattagtgcatacctattcagaccatagttcaactgttggactgaaggcccgtcttggg +gttcgtgaatgagagtgcagtttcttgtcttttccttaactgacctaaatgaaggcaatc +ggtttatctagagtcatgcttaaggtgaatttcagccaatgggctcccattgagctagta +tggtgctttacctttgtaagtggtggctttccttggtgtgctgactttaacacggcagag +tgattatccgaagaatggataataagacgctggcaatattggctaataaagtccgatgag +tttcaatcatgactgcgaggagatccatgcggtgtacctaaacctacatcgtatgtattt +gctgacgttcattcttgatacataaagatccgatatcggtccactttgtttaccaaaagc +cctaccttcgtaacgatggaaatgtgaatgagagtgaaatacacgatggggatattgccg +gtgagtacaagttagaccacacattagaactgacctatattcgtcatcatagagatggag +tatgaattgattctgcgaagtacactggctttacgagtatctagacgccgcggtatatct +cccgtcaatactatgaaggtatatatatagaggctgaaaattcatgttcaatcctctttc +taagagtgagtgggagccccttctgttgtcggagtaaaaaggcattattcctcaaattgt +cagaagcaaagtatacgtgatgtttgcttagaacaaaagagttaccttagggtaggtaaa +tctcgattcaccgagagaagtgattttggcggtgtgcgattaattcttttgatgacagat +ctcattattttatatagctccctctttgtatttagagtttgcgtaggtaacctggcaaaa +ccatatcccggggggagagtgcgctgaacattttatacgatgtgattactcaaaggataa +ggttcgaggcctctatactcatggaactatcttataattataatggatcgtggctcattc +cacctatccaaacttctttgtgatctgatgctacgagtgtgaacaaacgtacatcttcta +aggaatttgggacgtttcatagctcgcatttcattcctgaaaacttaaatatttttaaaa +attgattctactgcgaggaactaaggtgtagacaagcccttagtaaccggtggatgtcgc +ttcagttttatagcaaacattattcaatttcagtcttgactgaaattagtttgttagtgt +tagaggtccatatgtcacatgcatatggtctagatgccattgtacagtaataccttagat +tagtattagcggcatgcgtacttggatttcacttgtaagaatgagcttaggacggtcgcc +tgtagggctgcaaataggaatacttacaatttttgatgacttgttagcatatcgctatca +cccataaaaaacctgatacttgatgagcgggtgattgagactatgtactgatataattca +atagctccaatagatgaaacagctatgcgcctatttatgtcaaataatcgatgtgataca +agcttagagctgaacgagcgcgagtggaattagcggtgatctctatcctaaaaagccacg +aaatcgatcccagaagctaatacccgaggtgtcaagcttgagttcagttaaatttgcatc +tcatgccccacgaagaatgggtagagagtttgaaggtgcttctggattttcctaagtacg +tggtaaaaatttgatgtaaatgaacacctcctaatggttgtgttaaccacaaacccctgg +gtgaatctgattagccaacccagtgatctgatttcagttgtcaaatctcttttttataac +taccttttgtttccataatttaaccggatctcataatgaacaaacgggtagaataatggt +agcacatagcgagcttgtctattcagaaatatggcctactcagaatgtattctccaaatc +agtgttatgcgaaacgtaattttacgtgtaataatgatgatttcttatcggttccttgta +ctacaatactcttgcccaacaaatactaagcataacagcaaaattcgaatccccctcctt +ttaataaatggtttttcaatatagccgattcgtattcgttagtctttcaccaactattaa +cctggcatctaattaataaaatcaccaaaggactctataatatgacagtcacttcggcct +cttttaagacagttgattattgcaggtccgcaattgatggtgacatgcacaattagttag +aatccgactatggagacaattaacaattgtagtgcccatttggtccagttgacttcaacc +acgagttataaaggtattttaatttatagtcgatagtaccaacaacaagcacaatcataa +ttatgttagaaaacccagggggtaatgctctaaatccagctttaaggccagagtgcacta +tgaaatcgccattgatcattgtgtcattcgctgaacttggtgtctaggaggtgccgagtg +agaatatcagataccttatgaagcaacgattatatctggactagatcatgatgatcggaa +taaaacattgaaataagtccttatcaaggagcataaacattttatttaatttatacttcg +taaataaattcagaattttttttcaagacattaatctgagtaaatgacggctagaaaggg +ttcctactcgaatcgtagcctacgcatgtgggcagtaacctggcttgcgtttttactgaa +acaaaggttcaccggaaagaaggctgccacttttagcttcttgacgatctttagcgtcat +atttttagattagtcgaaaaacggaaaacaaacttaacgaagctggttgcacggggtacc +gagaaaccaaagagcaggacaactccttgatcgggaagaactgaaatagacagctgtcat +tttcattggtcaacttatcaatataacgaccaccgtagtgacgcttgcatgaaaatactg +aggatgtaaactatagccagtcaggcccgcgtgttgactaattgatgaagcaaacaaaat +agccggtattcgttaaaaggaacgggttgccagctacagatatactctaggtatatccca +aacaagagacgtcctttggctgttgtaatcggtcataatacttgtcacataaacaagatc +gctgaattaaacattaaacagttagtgatacacaatcgtggttggggctgggatgtgcaa +taaaaagtcatctatcgtctatcacagagcgacgtaaatttagacaaacattattatttc +ttgacaatggaatcgataagcgttcctctaacttggtatatatatctcgaccccgggatt +ccagccattcttgtatgaagatttaaccatttaactatgcatagttgaatggtaaggaaa +atgatattgactgcaacagattttggatgcaaaaatatttgtgaattattggttatatac +tggttgtatagcacaatcattaggtcctagaaggcatactcaacctcagcgagagagcta +gcatgcataattgtaccgcccatattaatattcctgaaatgatttcttacattacgccca +atttcagtcatcgaacacccccatcaatttacccgatagagaacgtgatcatacgcaata +ccctatgcgaacgtccactctatagcgtctgtatacaatgattattcgttccatttacaa +cgttaagtaatttaaacttacataaggacaaggaaatccgcgaacctcctggaatgtatg +agttatttatgcagttaacttcgtctcgaccggaactaaaggcgtcgtacgaatgaaagg +ccacttttagaagagacctttgtatccattgtggagaatatcataaattcaagatggggt +gtcatgctattcggtcctaaacattcttaatggctgttctattgttagtctgatttaaaa +tggaaccatagcacgaatagttagatagggctcatacccctgtaacgatctacaaatcct +tccccgggtgtgtgcgttagcgacggaaagttttacggtttgtgatcaaagaacactcac +acgtcagattattacactgatacgaattatttcagtcgacagtaattgaatagaaactta +ttaacgccagcacctgacacggtaagtaaggcaggtctgaactgtttgactgtaaaaaaa +tggtaatatttttaaaaatcttgatttctatatcaaatgatgtgtagttttttctctgtt +attaaaatcccagtgcgcgaaatttagatcgttacgactcacgtacaagatcacacatca +cacgcgttagcgaaagcggaatggctaatacagccctacgcaacgtagtgggatcaacat +atggacgaatttatgctcaatgagccaacctcccccgcattgcggttcattttaaggcct +gggtaacatctatcgtttagataatcaaaggaatccgactatgcaattgtctgacttcat +ccgctctcaagtccaatgcaggcgctacgtgtttctttaatcaataccatattgaaatcg +taatacgataattgttgctattgactacaggttatgaaaaaacttactttgcgggtacat +gcatatttttgtaccacattattacgcgatatctctcagtgtactctaaattaaaccctc +ttcgaacattttagttcctattcgtaaacacgtgctacgcggcaatttgccggtcgtaga +atggacaactccagttcaactgcatgtaactcatagctcgcgttagtataaattgactag +tagccatgggacaaagtaactagtcagcggaaaagatccctttaaagatatatgcaggtt +gcaagcataaagctcattgctcgaggtgcaccgtggtattccaaaagcgtctctatcgta +tcttctaattttgggccgtgagaatcgaaactactctgatttgctgcacacgttaggtaa +tatcgcccattttcccgtataagctccgtacttatacgaactacacgaccttttaagcat +tagccgctcatatcgtgattcgtgtacagatgagtctattaaaattacagacatactcca +tatctcgctccttgaactttgaataatgcgctaacttgtactatgaataggcagaaccca +actttcccgtttgcgtcaagcggggaaacgatacatgttgtcagatttatgattatctag +ttttagatcacgtttaccgataatcggctgtggtctgagcagtcctacactgagtattta +cttcagcttcatatcggtccgaaaaaaggttgtgaccgaatgtcaaaatacggagtacga +tgggcatcttttttcgagtcgcggttgcagggcagcaaaaggcttaaaccatttttacga +tttttactatagcggtcatgaagtgcgaaactgcttgcaaattttctacacacattgtgg +ctcttgtccttgaagcttatggcgaaaatttgaaacatagtataccagggaaagcgcgaa +ttatttggtgactaatagtccgtgggtttgagccatatacctaacgccataaactacgtg +gtgctttagatgcaatctaaacagaacagaaagcgtagcgctcatcagcacagactaact +ttttcagtttgagtcgccggagggacttcgagacaagaacgcgtcaagtcgcttgcgcgg +cacggattcgattgggcggctcaatcttgcctaatttctactattgtcagctgtacgact +gtactaagtgtatagccccaaataaaagaagtatcgatgcgtctttatgaccaaaggtct +tataattgaagcgcacttccgttcatcaaattaaatcctggcttacccgattctccggaa +gtctgacctagagattgacgacggccgcgtattattgagacctcttcaggattaatcaat +aacgaagtagttgatctgtttggcgacgtaccttaagccgactccgctacacgagtttct +actaaaccaatgtagccttatgcttagatgaataccgtcctaattagatattccggcata +acagcagtaaattatctgttcaatggacgaacattgaattgttagtattctacacaagtc +aggcctcgtaaatattaggtaaggccgtgggataacctacgtgatatgcttgagcttgcg +ttgcaagctctcgttaatcattaatttaggtgcgtgagggttaaacaccagcatattcta +tatgctagacgtcttccttaaaggatcgtagtattataattaataataagaaatatggtt +gacgtctagtcagcgggcatacgctgctctatatactggcattattcaaaacttgacggt +aaaaaaacgaattttaaggcgctcacgtcgaatgagccgaactcatgggaaccaaaatgt +cacagaaaacacctctttattgccaagcatgcaataaaaaaaatgttaatagtacgttta +cgacattttattttataataaagagaaactattacacctattgatatgataggacgtaaa +ttaacgagtagcctgcatagaggcaaatgaggtttctacatggtatagacctgatgctga +aacatcgatgagttttggtcccctcgctcgttgaaatctagtcatttactactgtctttc +gagctattataccacttcactatgtggtgtttctttgctatgtatggggctagtcaaaca +tgatgactatagctacaactcagagagcgggcgtgttaagagtatctcatgctagaactg +cacgacgaacttgatacaaagtaacaacatttacgattccacaaggtgactttgaagaaa +catagtttaattctctgcttcgatcatttctataaaccggtaccatcgcagcggatagat +gcataacatttctactactccaggcatcttaaaacacacgtagtacttcactagattaag +acacgataagtgtataacttggcagtgggaagcaaggagattggcgaactcctggcatct +gttacgttttgttcaggctcggttgttgataatgtccgactcctgccatattgaagactc +gctcgagggagatcgggattcgttgattataagtacacgtgttccgtaatactatgaggc +agtgattcaaaatggcacttctgacttacatgactaggtattattaccacggaagcgtta +aaggcacactcttatggacttaagattgcaagtgccttcttctagcctgaattcgcgggt +tcaacacaaactctctttagacatccgttgcctaaaggctgagacgtaggggcaaccctt +taactatgtactaaaaaactagttggtaatttaacaacgtgtccaatcaagacgatgcac +caacgcggtgcgaaaatcgggttaagcaaacacaaataggaattgtgataaaccccacct +tgagaggtcgcaagaccaacctcgggaacaacggctctaagagaataacctaaatccgga +tgagtagactgtgtaactctctaaagggaagtgaaaaaaagctaagcatacatttaggtc +tcctgcattgcattcaattgaatcgtttgtattatgagctgtacagtagctatatcagct +atagttatcccagaggaacaggtaaactagctctgagcgtgaaatccggatattagaacc +cctagatgggattgattctagctaatacaggcttatctggttttacagttatctagatga +ttggtaaggtgaaacgcttggtgccttccaccacttaaacaaaagtattgcccgggaagc +tattttctaggtattataaagtcgagcattaatatcaatttgacagtaaaggtctttcac +cagcttcatatgccatagggcccatactcgatttaaattgaacggtttaacgagtattgg +aactctcacttataactgagtagctatacgaaaaatctggtccatttccagaaatttatt +atcgatttgctgcttagtacccaggaagtgataacccttgaaggcacaacactgtaataa +gttttcctgtcacatctgtaatattcggtcactacgcattcacgactaaagataattact +atactaattaaaagttcaatgttagggccgaatcatagtagaaattctcgtctagcctaa +tcggacttacctatgggctgtgaggatttatcagtatgtggacaaaaatgctagagatag +gtatagttaaagtcaccatggtacatctatgtgaggaagtttgtagttcgcttctttagt +ccgggcgtttgggatgacaactactatacgtagagccgtactcaggattagatagtgtga +aagagtcaaataaaagggttaatattaatttaacgttgcaaatgtgtttaggccaaacat +taaccgttgtagggatattctaatacaggccttcaccgaaccctaatgataatctgtctt +aataacattaaatgattgtctccgctacgagctcttagggcctcattttaaatgactaat +gtccaaagaagagactttcccaatttcaatctgtcacgtatagacggcaccttagtgagt +catatcattaagatagaagattatcaggagggaagtttctattatcaaccgttacgcaac +cataaacttttaaatctcataatggcattgagatcaagagctttcatgatggtaaagttc +gtatgtgatgctggggagctagatatcggtataccacttcggttgtggtaagcccgagtg +ggccgttagtaatattaatagacgattatccgacaatgcattcgctgaaataatcttact +taggagaaattaatgctatgagccaaaactatttatgtctgtcacattattgactaaagt +atctatcgacaaaactgatgtccataagttgtagcagatagtcggtgtatggtgtcacca +atgaaaacctcgagcgaaaaatgaattatagttatccaatttgagtaaattgcctattat +acagataggcttgtttagtcagataaggttccgcttgaggtgctctaacttagcgagagt +tagaaagcctagtgagaggcattttggtgccaaactccggctcgcatgagtaggccagag +agtcactttctttcgtcgaagaagttggtgaacagccttttgattagttgtttgtcttgt +ggctatgtgctactatataagttagaacgcaaactaatctaatcagcaaagtaaaatagg +accttgaacgagacggggtacgccgttgaggctcgagatagtagataaactagaggaatg +tagataaaacattagctagggggtttagttactggattacataggaagtgcaccatcacg +gtgtgggggttcgtacgtaaagtcgcatcaatattgtcagtggacttaacaagttcgtgc +ataatgaaatcctatacggactttgcatatctctaccgactcatctggtcgtctatgcgg +gtaattgtattgctccaagtggatgactattttggcgtcccagcacatagtaaatgtaaa +tccttataatagcataagcaattattagactgcgtgaagtcttagtagttctcaagcttt +acgttgtatgtaaataactcacgtaatcagccgtccccaaatcaccattgaggtcattga +atgtacggagcactattatcaatgcggtatgcgattttctgagcgattattgttaaagac +ttagcgttgagccccggaacacttgattacagattctttaaggagttatccaaatatcat +tttaaataatagtagtatcgtgctttggacaataaaaaaagacccgttctcttatgttgt +tttgcgacgtacttctctgatatatacttcaactatgaagattctattcatcgataaccc +aggtatatttatatgcccgttcactgcgcagggcaaattatctacggacaataatgacgt +agttggacccggtaagaactaacgcttaatatgattaaggatgtatgccagtattatctt +attatgtcagagtagaagtttctctgagattttccgtcgttgtggtacaccggatttggc +tctctttttagaactgagaactcggagtgtgtagtcttgtttccttcaatttatcaatat +gcttttataccgccctcatcaactataacaggacgacaagttccgtcttgctccatcata +tactaccgatacaccaatcgtatcaagtttagtatacttgctttctctcttctacagctt +actcgcttgtccgagaagcggttggtgctcataaagttagtagtaaatgtacaactagta +gccagtccttacctgtttttacgactactacggacaccatgagatacagaagttagtgct +acaattataccattacatgctcaatatcgttgtcggccataagatcgaagagtgcatcac +gcgtgtgaatacgtaaaatctaccatcccgtcaatgcacaaaaacacactccccttgttg +actaacatcttttacaagaggctaaatcattgtccaggatcgaataccttgtgtacaatc +gtcacccatcggaagaataccacttttccgatgtagtatgatttacaaaaaacatctatg +tgagtaggccaattgtagtagaatatattcatttgaccgtcattagccttcttcttaggt +tgtgtacggatagtaggtacataaaccgtcgtgtggcatacgctgcgatttcatacagct +gccaacaccttttttaccaggctagagtcagaaaagttggagccatgttaaatagttacc +atcataaaccactgttgtctactagtctgatcagctttcatgcctgtgcaagcaatatgg +attctcacgtaatggtaacaactgttgcgttacttaggctggttaatttgtcagagtaat +aaatacatgtcttgttgtgtttcctaatcctcggaaagtacacaagcctaggaataggaa +aagtaaagctcttttattctgatagtgactaactcaggatctaaatacgcgattatacta +accttcaccaaagctcaaaaatcatctgctggtgaccagttatagacagggtaattcaat +atttaatgtctcccttaacatttcaccagcatggattgaagatagtataaagttttacat +ggcagtcattgtgtcacggttctatacaaattctgatagttagacggtatttgaaatgtg +cttctagcatggtatcttacacaactgaatgaacgactggagccgttcgtatactatttg +cgagcctcgagaccccgtttcctaatgttaacgaatatagtataatataaattgtgatat +gaataacacaagtaactacagtttggacaattaattgttctaaactaaaaatcattcact +tcagatggcatagagttatggctactacacatataaagcggtatgtgaaacacccgtttt +agccggaaaccctctactgctcgggacaatgaatgatttccaaaatatggatgtgcagaa +ttgttagtgtgactcaggtccaaatagacactttagtttcgtcaagtcgttgcaaagttt +aaaaccatcgcagcattctttatttggtctacattgagaaatgaaaaaacgtgacagaaa +gtctagaagaactgtgaataatgtctattactgattaactagtaagacattagtgcatct +ggtccactgaagcacccgcttggcgttaggcaatctctgtgaactgtcgtggctgttccg +gtaatgtacgaaagcaagcctataggttgatcgagtcgcttcattaaggtcaatttcaca +atatccgatcacattgtgctaggttcgtcctttaccttgcttagtgctgcatgtacgggg +tgtcatgacttgttatcggcagactctttatcccaagaatggataatatgtacatggaaa +gtgtccataattaagtcccttcactgtaaagaatgactgccacgtgatccatgaggtcta +cagaaaccgacttacttgctttttgatcaacttaattatggattcataaagttcagatat +cggtacaattggtgtacaatatgaaattaatgaggaaacatggaaatctgaatgacagtg +atagaaaagatccccatttgcccggtcagttcatgttacaccactcattagtactgtaag +tgtttcgtcagcattgagatccacgatcatgtgtttatgccttcgaaactggatgtacga +cgatcgagacgaagaggtatatataacctaaatactaggtacgttgttagagagacgatg +aaaattaatcgtcaatacgctggcgaacactgagggggacccaatgctcttctcggtcta +aaaaggaatgtgtcagaaattggtcagttcaaaagtagaccggatctttgcggagaacaa +ttcacggaacgtagcgttgggaaatatcctttctaccacacatcggattttcgccctctc +ccattatttattgtgttctcacatagaattattgtttagacatccctcgttgtatggaga +gttgcccgagcgtaaaggcataatccatataccgccgggtgagtgacctgaaattgtttt +tagttgggatttcgctatggattagcttacacgaagagattctaatggtactataggata +attataatgctgcgtggcgcagtacaccgttacaaacgtcgttcgcatatgtggctaaca +cggtgaaaatacctacatcgtatttgcaatttcggtcgtttcatagagcgcattgaatta +ctcaaaaattatatatgttgattatttgattagactgcgtggaaagaaggggtactcaag +ccatttgtaaaagctgcatctcgcttaagtttgagagcttacattagtctatttcagtct +tctaggaaatgtctgtgtgagtggttgtcgtccataggtcactggcatatgcgattcatg +acatgctaaactaagaaagtagattactattaccggcatgcctaatgcgattgcactgct +atgaaggtgcggacgtcgcgcccatgtagccctgataataccaatacttacatttggtca +gcaattctgacattatacctagcacccataaatttactcagacttgaggacaggctcttg +gagtcgatcttctgtttgtatgcatgtgatcatatagatgaataagcgatgcgactagtt +agggcatagtatagatctgtgtatacagttcagctgaacgtccgcgagtggaagtacagc +tgagatctatcctaaaatgcaaccatatcgttcacacatgatatgaacccagggggaaac +attgagttcagttaaattggcagcgaatcccccaagaagaaggcggagtgacgttgaacg +ggcttatggtttttcagtacttcctccgtataagttgagcgaaatgtaaacagaataatc +gttgtgttaacaacattaaaatcgcggaatatgatgagaatacacagtgtgagcatttca +cttgtaaaatatctttggtagaacttactttgctttaaatatgttaaaccgatctaataa +tctacaaaacggtagattttgcctagcacattgcgtccttctctattcagatagaggcaa +tactcagaaggttttatccaaagcactgtgttgactaacctaagttttagtctaataatc +atgattgattataggtgccgtggactacatgactcgtccacaaataatacttagcagatc +agcaattggccaagcacccgacttttatttaatggttgtgcaatagtccagattcgtatt +cgggactctttcaaataatagtttcctggcatctaagtaagaaaagctcataaggaagcg +atattatgacacgctcttccgccgctgttttgaaacttgagtattgctcgtccgaaattg +agggtcacttcaaaatttactgagaagacgaagatcgactaaagttaaaatgctagtcca +cagttggtcaagttgaattcatccacgagttatatagctattttaatttatagtcgagtg +tacaaaaaacatccacaataagatttatcttagaataacaacccccgtatcatcgaaatc +ctccgttatggcctgactcctcgagcttatagcatttgtgctggcgctcttgccaggaac +ttgctcgcgaggtggtgacgagtgagatgatcagtttcattatgatgatacgattttatc +gcgactagttaatcatcatagcaagtaaaatttgaattatgtcattatcatgctccatta +acaggttatttaattgatactgacgaaattttttcacaatgggttttctagaatttaata +tcagtaattgaagccttcataggggtcctactagtatcctacacgacgcaggtccgcagt +atcctggagggacgtgttactgattaaaagggtcaaaggaatgaaggctcacaatgttac +ctgcttcaccatagtgagccgatgagttttacattagtactaaatcccaaatcatacttt +acgatgaggcttgctagcgctaaagagaatacatacaccaccacatagaattgttagcga +tgatatcaaatagactcctggaagtgtcagggggaaactgttcaatatttcgtccacagg +actgaccaggcatggaaaagactgacgttggaaactataccatctcacgcccgacgcttc +actaattgatgatccaaaaaatatagcccggattcctgattagcaaagggttcacagaga +aagatattatcgacgtatatcccaaaaaacagacgtaatgtgcatcttcgaatcgggatg +aatacttgtatcataaaaatgtgacctctagtatacaggttaatgttagtgatacacaat +actcgtgggccatgggttctcaaataaaatgtaatattgcgtcgatcactcacccacgta +tttggtctaattatgttttatttagtgacaatccaatagataaccggtcctattaagggc +tatatttttagcgaccacgcgtttaaacaaaggattgtatgtagatggtaccagtttaat +tgccagtgggcaatcctaagcaaaatgagattctatcctaaagtttgggcttgatataag +atttcggatgtatgggttttataatcgttggagagctcaatcatgagctaatacatggat +ttcgctacctcaccgagagaccttgcatgaagaattctaaccaaaagtttaataggccgg +attggattgagttaattaagaccttgttcagtcatagtaaaaacccttaaattttaccga +ttgacaaagtgagcagtcgcaataccctatgcgaaacgcctcgatagtgactaggtatac +aaggtttttgagttcctttgaaatagttaactaatttaaaattaattaacgacatggaaa +tcacagaacctaatgctttgtaggagttatttatgctgtttactgcctctacaaccctaa +taaagcagtcctaagaatgaaacgcatcttttagttcagaaagtggtatccagggtggtc +aatttaataaattcaacatcgggtctcaggatattcggtcatataatttattaagggctc +ttcgagtcttactctgagtgaaattggaaacagtcatccttttcgttgtgaggcatctta +caccgctatcgatatacaatgcattccaccgcggtgtcccgtacacaaggaaacttgtta +ccttggggatataagaaaactcacacgtctcattattaaactgagtacaatttttgcacg +agaaagtaatgcaatacaatatgatgaaagccagctaatgaaaagggatggaacgcacct +cggatctgttgcactggattaaaatccgattatttttaaaaatattcagtgctagagcat +atcaggtctacttttttatctggtatgtaaagcccacggagcgatagtgagatccttacg +actcaacgaaaagttataacataactcccgttagccaaagcccaatcccgattactgccc +taccctaacgtctgccatctaaatatcgaacttgttatgatcaatgtgactacctcccac +cctttccccttcatttgttccactggggataagctagcgttttcagaatcaatgcaataa +gaatagccaattgtctcacttcatcagagctcttggcaattccaggcgctacgtggttct +ggaatatattcatttttcaaatagtaatacgtttagtgttgctattgtctacacgtttgg +atattacgttatgtgagcggacatcaatagttgtctaactctttagtaagccagagatag +cactcttagcgaatggataccatcttccataagtttagttaatagtccgaaacaactgct +tcgagcatatttgaacctccttgtaggcaaatagcctcttcaaagcaatcttactaatag +atagagtttgttttaagggactactagaaatgggacaatcttaatagtatgacctaaact +gacatttaaagatatatccaggtggcaagcataaagatcattgcgccacctccaccgtgg +gattacttatcagtcgatatcctatatgctaagtttgcgacggcagaatacaaactaagc +tgagttgatgctaaccttacctatgataccccattggaccggttaacagccctacttatt +ccaaataaaagaacttttatgctgtagaagctattatagtgatgcctggtaacttcagta +tattaaaatgacacacatacgccatatagagctcctggaactttgaataatgagcgaact +tcgaagttgaagagcaagaaaccatatgtcacggttgcctaaagcccggtaaccagacat +gtgctatcattgatcattatcgaggttttcataaccttgacccattatcggctgtgcgcg +gacaagtacttaaatcactagtttcttcacctgcttatcggtaagaaataaggttggcaa +agaatcgcataagacggacgtagagccgcagcgttgtgcgagtccaggtgcatgcgcagc +aataggattttaaattttgttccatttttaatttagccgtaaggatgtccgtaaatgatt +gaaaattggattcaatctttgggcctatgctactggaacctgatcgacaaaatttcaaac +atacgttaactccgaaagaccgtatttttgcggctagaatagtcagtcgcttggagccat +ataccttaccacttaaacgacgtgctcctgtagttgaaatataaacagaacacaaagact +accgatcatatcaactgaagatctttgtaactttgaggcgaagcaccctcttcgagacaa +ctaagagtaaagtaccgggcgccgcaaggagtcgattgggaccctaaatcttgacgaatt +gctaagaggctcagagctaccactgtaatttctctagagcccataataaatgaacgatac +atccgtaggtagcacctaagggattataatggaagccaaatgcagttaataatattatat +actggcgtacacgattcgacggatctctcacatagtgattcacgacccccccctttgatt +gacacagcgtcagcattttgcaagaacgatcttctgcatagggtgcgccaccgtaaggat +gacgtcgaagctacaactgggtataatttaccatgcttccctgatgctgagtgcaataca +ctaagaatgagtttttaccccatatcaccagtatttgttctgttattgcgaagaaatggc +tatgctgagttggcgactaaagtcacccatcctttttattaggtaaccccctcccttaaa +ctaactgatttgctggagctgccctgcatacatatactttatcatttatggacgtccgtg +acgcttattatccaccatagtcgatatgctacacggattcattaatggatcgtaggagtt +taagttatatttactaagatcggtctcggctactatcccgccttacccggcgctatttac +ggccatttttaatatattgacggtaattattcctatggtttcgaccgcacgtccttggac +aagaaagaatggcaaaaaaaatgtaaaagaaaaaaaatattgagtccctaccatcatata +aaaaatatgtgatgagtaacttgacgaaatgttagtggttattaaagactatctattaca +ccttttgttttctgtcgtagtatattaaagtctagaagccttacaggaaaatcagggtta +tacagccgatactccgcagcatgaatcatcgaggaggtgtcctaccatcgcgccttgtaa +tcttgtctgtgtatactgtatttagaccttttatacaaagtaaatatctcggctttatgt +gattgggaggggcctactcaaacatgatgacttgacctaataatcactgtgcgggcgtct +tatgactagctattccttgaaatccaccaccaaatggttaatatgtaaaaactttgacga +tgaaacaaggtgaatgtgtagttactttgtgtaattagctgcgtcgagcattgcttgtaa +aaccgtcaatcgcacacgttacttccataaaatttctacgaatacacccttcttaaaaaa +aacgtaggaattcacgagtttaacaaacgataactgtataaagtggaagtccgaagaaag +cagatgcccgaactactcgaagatgtttcgttttcttaaccataggggcttcttaatggc +ccactacgcacattttgttcaagcccgagagggacatccccattacgggagtattactaa +aactgttccgtaatacgttcagcaagggatgaaaaaggccactgctcaagttattgacgt +gggagtattacatcggaagcctgaatcccacactatgatggtctgtacaggcctagggac +tgcgtctagacggtattaccggcttctaatcatacgatcgtgagtcttaacgggaagtaa +ggctcacacctaccccaaaccatttatctatgtaagtataaaattgtgcgtaagtgttca +aagtggacaataaagacgtggcaaaaacccccgcacataagccgctttagatttcacaaa +taccaatgcggttaaaaacatccttgagtcgtacatacaccatactcgcgttaaacggat +ataacagaagataataaatccggatgtggagtcggtgtaactatagaaagccaagtgaaa +taatgcttaccagtcatttagctatacggctttcatttcatgtcaagagggtggagtttg +acctgtacagttgatatatcaccgatacttagaactcacctaaagctaaaattgctcgca +gcgtgtaatccgcatattacaaacaatagatgggattcattatacataagacacgatgat +ctgctttttcaggttgcgagatgttgcctatcgtcaatcgagtcctgccttacaccactt +aaacaaaagtattgacagggaacctattttcgaggtattatatagtccagcttgaatatc +aatttgacagttaacctagtgaaaatcagtaagaggaaatacgccacattctccagtgaa +attctacgggttatcgtctagtccaactatcaattataactcacgagatataagtaaatt +ctcgtacttggcctgatttttattatactttggatccttagtaaacaggaagggagaaac +cttcaacgaaaaacactggattttgttttactctcaaagctcttatatgacggaaatacc +ctgtcaagtcttaactttattactagactaatgaaatgggcttggggtggccagaatcat +agtacaatttagcggatacactattcggactttcctatcggctgtctggttggataagta +tggggactaataggctagacatacctatacttaaactatacaggcgtcatctatctctgc +aactttggagttccctgatgttctcccgccctttgggttcacatcttctataccgacacc +cctaataacgattagtttgtgggttagagtaaattaatacggttaatattaatgtatcgt +tgaaaagctggtgtcgccaataaggtaaccggctaggcagagtatatgtcacgaagtata +actaccctaatgataagctgtaggaataaaattaatgctgtctctaagcgaagagatatt +tccgactctgttttaatgacgaatctcattacttctgacttgcaaatgttcaatatggca +cggtttcacggcacctttgtgacgcatataatgaacttagaagattataacgacggaact +ttatatgataatccgttacgattaaagaatctgttaaatatcataatggcattcagttct +agaccgtgcatcatggtaaacttactttctctgcatggcgacatacatttcgctattcaa +attcgcgtgtggttacacccactcgcacctttggaatattaagagaagatgatcagaaaa +tccattcgctcaatttttctgacgtacgtctaatttatcctaggagacaaatcgttttat +gtctctcacatttttgaagaaaggttcgagagacaatactcaggtcctgaactgctagaa +gatactcggtggagcgtggcaacaatgaaaaactcgtgacataaatgaatgatacttttc +caagttcagttaagtgaatatgtttaacatacccggcttttcgatcttaagctgacgctg +gacgtgcgagtaatgtcagtctcttacatacactagtgactccaagtttcgtcaaaaacg +ccccctcccttctcgagcccactcacgctatgtattgacgcgaacttgttcgggatcaga +cttttcaggagttcggtcgcgtgtccctatgtgctaatatataagttagatcgcattaga +tgctaatctgaatacttatagacgaccttcaacgagaacgggtaccaccttgaggctaga +gttaggtgtgaaacgacaggtagggacatataaaatttgagtgcggctttagttaagggt +ttaattacctactcaaacatcacgctcgcgcccttcgtacgtaatcgaccatctagaggc +taaggggactgtactaggtagtgattaatgatatcctagacgcacgtgccttagatcttc +agactctgatggtccgcgatcaccgtaattgtagtcctccaactcgatcactttgttggc +gtcaaagaaattacgatatctaaatacttataatacaataaccaaggatgagaatgactc +atcgcgttggagttatattgcttgaagttctatggaatgaaagcacgttatctgccgtcc +caatatctccagtgagctaattcattggacggtccactttgatcaatccccgaggagatg +ttcggacactttagtctgtaacacttagcgttgagaccacgaacaattgattactcagtc +ttgaaggtgttttccaaagttcattttaaataagactacgataggcctttcctattgata +taaactacccggctctgttgttcgtgtgagtcgtacttctctgtgtttttctgattatag +caagattcgattcttagtgtaaacagcgatttttatttgacccgtcaatgagaagcgcat +aggatctaagcaaaattatcaagttgtgccacaaggtaagatctttccagttattgcagg +taggatgtatcccacgttgatagtatgaggtctgacgtcaactgtctaggagagttgacc +gcgtgcgggtacaccggatttgcatcgatgttgagaacgcagaactcccactgtcgtggc +ggcgttcctgatatttagcaagaggcgttgataaagccctcatcatctagatctcgacct +catctgccctcttgctccatcattttctacacagactactttcctatctacgttagtata +attgctttctatcttagtatcatttagagcttctccgtcaacaggttcgtgctattaaag +ttagtacgaaagggacaacttgtagcaacgcatttaatcggttttcgactacttcgcaca +aaatcagataaagaagtttgtcattctattagacattgaattgcgcaattgacttgtacc +acttatgatcgaacactgaatcaagactgtgattaactaaaatagacaagccactatatc +aactaataaaaacgcccctggtggtcgaacatagttgactacaggataattaattggact +ggagccattacattctctacaatcgtatcacttcccaagtagacaactttgaccttgtag +tttcatgtacaaaaaaatgctttcgcaggagcacattggtagttcaatagtttcatggga +acctcttgagccgtcttctgtgggtgtgttcggatagtaggtactgataaagtcgtgtcg +ctttcgatgagagggaattcaccggaaaacaccttggttaacaggatagtctatgtaaac +ttcgagacatgtttaagagttaccagcttaatccacggtgctctactagtatcatcagct +gtcttgcctcgcctagaaatatgcattctatcgttatcctatcaacggttgccgtactga +gcagccttattgtggaagagtaatatataaatgtagtcttgtctttacgaagcagacgta +agtaataatgacttggaataccaaaactaaacatagtggattatcatactcaagaactct +ccagataaataacagtttttacgatacgtcaccaatgagcttaaagattaggatcctcaa +aactgatacaaacgctaattcatttgttattggatccagtatcagttaaactgaatggag +tgaagattgtagaatgttgttctggcctcgcatggggtctaggtgatatacaatttctca +tacttacacggtagtggaaatctgattctagcttcgtagctgactatactcaaggaacca +ctgctcaaggtaggagactagttccgaccctacagtcaaagtggccgaagcttaaactat +agactagttgttaaatgctgatttcaagatatcatctatatacagtttggacaattatgt +gtgcgaaactaaaattcatgctattcagatggatttcacttatgccttagaaacagatat +tgcccgagctcaatcaacagttttagccggaaacaatcgaagcatagggacaatgtatct +tttcctaaattgccatgtgcagatttctgagtgtcacgaagcgcataatagaatcttgtg +ttgcctcaactcgttgaaaagtttaaaacaatcgcagcagtctttttggggtctactgtg +tgtttgcaaaataactgaaagaaacgcttgaacaactctgaagtagctcgagtactcatt +aaagtgtaacacattagtgaatatcggccaatgaaccaaacgcttcccggtacgctatct +ctctcatcgggaggcgatgtgcaggttatctacgaaagcatccctttacgttgagagtgt +cgatgcatgaacctcattgtaacaatagcccagcaaattctcatacgtgcctcagggtcc +gggcgtactcctccatggaagggcgcgcatctagtgttataccaactcgctttttaacta +ctatgctgtagttctacaggcatagtggccagtattttctaacttctctggatagatgct +ctcactcctcatccatcacggcttcagtttacgtcttacttgcttgttcagcaacggatg +gaggcattaagtatcttcactgttccctaaaattgctgttcaatatcaaagtaaggacga +tacagggaaagctcaagcacactcattgaatactgccccagttgcaacctcacttaatct +gacaaaaataatgactactctaagtgttgcggaagcagtctcttccacgagcttgtctgt +atcacttcgtataggcatgtaactcgatagacacgaacaccgagtgagaaactatattct +tgcttccgtgtgtgtgacaccaggtaattgatgcggatataagctggagatcactcacgc +ccacacaaggcgctgctacctctttattccaatgtgtaagaatttgctaacttcatttct +agaccgcagctttgcggtcataatttcacggtacggacccttgggttagagacttgataa +cacacttcgcagtttccaccgcgcacatgttttagtggcttctaacatagaatttttgtt +gtgacataaagagtgcgtgggagacttgcccgaccgttaagccataatcaattgaaagcc +ccgtgagtcacatctaattggttgtactgcgcatttagctatcctttagctgactcgaag +agattcgattcctaatataggttaattagatggctgccgcgcgaagtaaaacgtgaaaaa +cgtagtgcgcagatctgcataactcgcgcttaattacttatgagtagttccaagttcgct +acgttatgagagagattggaattaagcaaatatgttttatggtgattttgggatgagaag +gactgctaagtacggctactaaacaaatttctaaaaccgccatctaccttatcttggaga +catttaagttgtatatgtcactagtctagcttttgtctgtgggacgcgttctcggaatga +gggaaatgcaagagccgattcatcaaatgcttatctaagaaagtagtggactattacacc +aagcacgaatgccagggaactgctttcttgctcaggacctcgcgacaaggtaccccgcat +aagtcctagaattacatttggtcagcaatgctgacatttgaccgtgaaaacataatttta +atcagaaggcagctcacccgcttgctctagatcttatctttgtatgaatgtcagaattta +ctgcaatatccgttccgaatagtgagggcttagtatagttctctgtatacaggtcacatc +aaactccccctgtcctagtacagctctgagctttaattaattgcatacatttccttcaat +catcagatgaaaacaccgcgaatcatgctcttctcgtatagggcaagagaagcaacaaac +aactagcccgactcacgttcatccgccgtatccttgttcagttcttactccgtattaggt +cagcgaaatctaatcagaataatcggtcgcgtatcaaaattaaaatcccgcttgaggttg +acaattaaaacgctgagcagttatcggctattagatagtggggtgaaagtaattggctgg +aattatgttaaaacgtgatattaagctaaaatacgctacttgttgccgacctaattcagt +cattcgatattcagttagagccaagaataacaagcttgtataaattgaacggggtgcact +aaacgatgtgttactctaatattcagcttggagtatacctgaaggcgaattcatgtatcg +gccaataataagacgttgaagatcacaatttggactagcaaaagaaggtgatttatgcgt +ggggattgagtccactgtacgagtacggtctctggaaaattataggttcagggaatataa +ggaagtaaagataattaccaagagatttttggtatcgctatgacccagaggtgttctaac +gtctgttttgatccgcagaatttctgcctcaatgcatatttgacggacttgaactagagc +ctctaaagttaaatggcgacgcaactgttcctaaacttcaattattactactcttttttt +cctagggtattgtagaggccagtggacaaaataaatcaaatttaagatgtttcggacatt +aacatcccccgtagcatagaaatcatcagttatccaatctctcatcgagcttttacaatt +tctgctggcgctatggacagcatatgccgcgagacctccgcaagactcacttgatcactg +taagtatcttcattagaggttagagcctatagttaagctgctgacctagtaaaattggta +ttttctaattttattgctcaagttaaaggttagtgaagggataatgacgttatttttgaa +caatgggttgtattcaattttatatcacgaatggaacccttcattcccggcataatacta +gacgacacgaacaagctccgatctatcagccaggcacgtgttaaggtttaattccggcaa +accaatgaagcatcaaaaggtgacctgatgcaacttagggtcacgatgagtttttcagga +ctacttattacctattaataagttaacatgagccttcataccccgtaagacaatacatac +tccaccaattagaattctgagccatcttatctttttgtatcatcgaagggtatggccgaa +taggttaattagttactcctaacgtctctacaggcatgcatttgacgcaccttcgaaaat +agtcaatctctcgccacacgcgtctagtatgcagcatcaaaaatatagtccacggtttcc +ggattaccaaacgcggcaaagagaaacattgtatcgacggagataacttaatacagaagg +aaggggcatcttcgaatacggatgaataattctatctgtttattctgacatcttgttttc +aggttaatcttacgcattcaaatgacgcctgccccatgcgtgcgcaattattttctaata +ttgacgagagcaatctcactccttttgggtctatttatgttttattgaggcacaagccta +tacagaacaggtactattaaggccgtgagtgtgagactcaaaccgtggaaacaaaggatg +ggttgttcttggtacaagttttagtgcatgtgggcaatccttaccaaaatcagatgctat +ccttaactttgggctgcatttaagatggcggttggaggcctgtgagaatcctgcgtgtca +tctttaatgaccgaattcatccatgtagattcagatcacacactcattccttgatgttgt +ctaaacaaaagttgttgtggacgcattggagggagttaagtaacaacttgggatcgcata +cttataaaaattatatgttaaactttcacaaacgctgaagtccaaagtaactagcccaaa +cgcctcgagagtcactaggtattaatggtgtttgagttcctgtgaaatagtgttcgaagg +taaaatttatgtaccaaatcgaaagaacacttaataaggcttgcttgcacggaggtatga +tgtttactgactctacaaccctaattttccagtacgtacattcattccaataggttagtt +ctcaaagtgctatacaggctcctcaattgatgatatgcttcagccgctctatggatatta +gctcattttatttaggaagcccgcttagaggcttactatgagggaaatgccaaaatgtca +tacttttcggtgtgtcccatatgacaccgctttacatagaatttgaattaaaacgcgctc +tcccgttcactaccatacttggtaccgtgcgcatattacatatagatataggatcatttt +ttaaagctgtactaggtttgatcgacaatcttatgctatactatatgatgtaaccctcat +aatcaataccgatcgtacgatcctagcataggtggcaagcgattttatgccgattattgt +gttaaatagtctgtgagtgtgattatcagggctacgttggtagaggggttgtatagacct +cgcacacattgtgacatacttaacaatatacgaaaactgatataataaatccccttaccc +aaacaccaatcccgttgaatcaactaccataacgtctcccatataaattgcctacttgtt +tgcataaatctgaatacataacaccattgcaccttcttgtgttccaatcccgttaagatt +gccttgtcagatgatatgcaagaacaatagcatttgctagcaattattaacagctcttcg +aattgcctccacataacgcgggagggtatattttaatttggcaaatactaagtactgttg +gcgtcatatgctattaacggttggatattaagttatgtcagccgtaagcaagagtgggcg +aaatattttgttacccagtgagagcactcttagagtttggatacaataggccatatgttg +acttaagaggacgtaactacgccgtacaccattgttcaaccgacttcttggcaaatagaa +tcgtattagcaatcttaagaatagagacacgttcgtgttagggtatactacaaatccgaa +aatcttaagaggatcacctaaactgaaatttatacatatttcaacgtggatagatttaac +ataattcagccacctccaacctgggagtaattttcagtagatttactagatgattagtgg +cccaacgcacttgactatataagatctggggatcctaacctgacctatgagacaaaattg +gaaacgttaacagcccttatgtgtacaaagaaaagtaagttgttgctgttcaacagatga +tagtcatgacgcgtaacttcactatagtaaattgaaacaaatacgcaatttagacagaat +ggtacggtcatgaatgacagtaattcgaagtgctagaccaacttaaaataggtaaacgtg +cccgaaaccccccttaacagaaagctgctatcatggtgcagtatcgacgtgttcagaaac +ttgtaacttttgagcaggtccgagcacatggaagtatatcacgtgtttctgaaccggctt +atccctaagatatatccgtcgcaaactttcgatttagtcccacgtagagcccaagcgttg +tgcgactccacgtgcatgcccagaaatacgagtttaaatttggttacatggttaattttg +accgaagcatcgcactttatgattgataattggattcaatatgtcgccctatgcgaatgc +aacatgatccacaatttggctataagacgtttaatccgtatcacactttgtttgcggcta +gtatagtaacgcccgtgcaccaagagtcagtaacaattataagtactccgcaggtacttc +aaatataaaaactaatcaaacacgacccatatgatcatctgaagatatttggaactttct +cgacaaccaccctcgtactcaatacttacactaatcgacaggcacacgcaacgtgtacag +tcgcaccatattgagtcaagatttgcttagtggcgatgagcgtacacgcttatttctcta +gtcacaattagttatctacgagacatcacgagggagcaaataagcgatgttatggctaca +cataggcacgtatgaatatgatataagccagttaaacagtcgaaccatcgagcaaattct +catgcaccaacccacacgttgaggcacaaagagtaagctgtttgaatgtaacttcttctg +ctgagcgggccccaacgtaaggatcaactagaagagaaaactcggtattagtttaaatgc +gtcacggagcatgagtgcatttcactaagaatgtctgtgtaaccaatataacatctattt +gttatctgattgcctacttatggctttgcggtcgtggcgactaatgtctccaatcctttt +gaggtcggtaccaactccctttaaattacgctgtgcaggctcatgcactgcatacatata +cggtagcaggtagggacctcacgcacccttattataatcaatagtagttatcagtcaacg +aggcaggaatgctgaggtcgaggtgttggtatattttctatgtgccgtctaggcgactat +cacgcattaccaggcgagatttaagccaattttgaatatagtcaacgtaatttttactat +gggttccaccgaaacgccttgcacaactaagaatcccataaaatatcgatatcaaataaa +agattgtgtcaataccttcatatatattttttcggttgactaacgtgaactaaggttagg +ggttttgtatgtctatataggaaacagtttcttttctgtcctactttagtaaagtcttca +agccttactccaaaatcacggtgattaagccgttactcagcagcatgattctgcctgctc +gggtcctaaaatccagccttgtaagagtcgctgtgtattagctagggagacctttgttaa +aaaggatatatcgcggcgggatgtgagtgcgtggcgcatactcaatcttcagctcgtgtc +attataatatctctcccccacgcttttcactagatatgccgtgtaagcaaacaccttatg +cttaatttcgaaaatattggtacttgaaaaaagctgtaggggtacttaatgtctggtagg +agatcaggagagaattgagtgtaaaaccgtaaagccctcacctgacttcatgtaaatggc +ttagaagactccatgatttaataaatactacgaaggaaagactggatctaaagataactc +tagtaaggccaactcccttcaatgctgttgccagttataatccaagagctgtccttttct +gaaccatagcggcttctgaagcgaactagaagcaaagttggttctagccagacagccaca +taccctgtacgggtgtattactaaaactggtccggtattagttcaccaagggaggaatta +ggcaaaggatctaggtatgcaagtcggagtattacatccctaccctgaatccatcaatag +gttcctctgtactggccttcgcaatgagtattcaaggttgtacagccgtataataataag +atagtgactatgaacgggaagtaacccgctcaccttccccaaaacattgttatatctaag +tattaaagtctgccgtagtgttaatactcgaaaataaacaactggcaaattacaccgcac +ttaagccgcttttgatttatatttttccaatgcgcttttaaaaataattcagtcctacat +actaattaagacccttaaacggagatatcacaagttaagttttaaccatctcgactaggt +ggaactatagatacccaactcaatttatcattacctgtaatgttcctagaaggattgcat +ttcatgtcaagacggtggagtttcacagcgaaacttcagtgtgaacagattctgagaaat +cacctaaacctattagtcagagcacccggttagaaccagttgtcaaaaaatagagcggtt +gcatgagacagaagtaacgatgagatccgttgtaacgttgagacatctggcctatcgtca +atacagtcctcccttaaaaatatttttaaatactaggcaaacccaacataggttagtcct +atgtgatacgccacatggtatatcattttgtaacgttacctagggataatcaggaagtgg +aattacgcaaaagtagacagtgaaatgcttagggttatagtctagtccaaagataaagga +taaagcacgtcagagaactatattagccgaatgggaatcattgttaggagactgtggatc +atgtctaaaaagcaacgcagaaacagtcatcgaaaaaatctcgtttttgtttgaatctaa +aagagctttgatgaccgatagtacctgtatactagttactgtattacgtgtctaatgatt +tcggattggggtccccagaatcagacgtcattgtagacgattcaagtttaccaatttaat +ttcccagctctccttggagaactatcgccaataattgcagtcactttccttttctgaaac +gataaagccgtcagagttctctgcaacgttggacttacctgaggttctaacccactttcg +gttctaatagtagttaacgacacaacgaataacctttactgtggggctttcacgatattt +tttcgcttattattaatggttacgtcataagctggtgtccaaattaaggttaccggcttc +gcagagtagttgtatccaagtataacttccctaatcataagatcgaggtagaaaattaat +gctgtctctaaccgaacagatatgtcccactatgtggtatggacgttgctaattacttct +gaagggaaattggtcattatggatacgtgtctaccatcaggtcggacgcagatatggttc +tgtcttcagttgatccaccgttctttataggataataactgacgattaaagattatggta +aatagattaagccaattctcttcttgtcagtgaagcatccttaactgacttgctctgcag +cccctcatacatttagctattcaaagtaccggctcgtttcaaactctcccacctttggaa +gaggttgtcaacttgataagtatatcatttacagcattttttcggacgtacctctaatgt +ttcattgcagaaaattagttttttctatcgcacattttgcaagtaacgttagagacacaa +ttatctgcgaatgaactgctagatctgacgaccgggagcctcgcaaatatcaaaaaagac +tgacatatatcaaggagtcgttgacaagtgctggtaagtcaattggtttatctgtcccgg +cgtttcgatcttaagctgaccatgcacggcagagtaatgtcactctcgttcttacaagtc +tgtctccaagggtcggcaaaaaagacccctccattctcgagcccactcacgatatgtagg +gacgacaacttgtgcggcttatgaattgtctggactgcgggcgagggtccatatctccga +agttagaagggacatacctttagatgataagatcaattcttattgacgaaattcatccac +aacggggaacaacttcaccctagacttacgtctgaaaagacacctagcgtcttataaaag +gtcagtgccccgtttcgtaaggctggaattacctacgcaaacttaaacctcgcgcccttc +cttacgtatcgacaagatagaggctatcgcgaatgtactacggaggcatgaatcatatac +tagaaccaagtgcctgtgatattaacaagatgatccgacgcgagcaccgtaattctaggc +ataaaactccagcaatttgggggccgaaaacaaatgacgttagctaattaattatatgac +atgatcaaaggaggtcaatcacgcatcgagttcgacgtatattcattgaacttcgtgcgt +ttgaaagaaacttttatgaaggcaaaattgatcctgtctcctatttcatgcgtacctcct +agttgataattccccgagcagtggttaggacacttttgtcggtatcaagttccggtctca +aaacgtaaaattctgtaatctgtatggatggtctgtgaattagttaatttttatgaagtc +gtcgagacgcagttcctattgatttattctaaacggagatgtgcttcgtgggactcggaa +gtagatctgtgtttatgattattgctactttagatgctgactgttaactccgtgttgttt +ttcaaccgtatatcacaaccgaattggatagaacctatagtttcaagttctgccacaagg +tatcatatttacagttagtgctggttgcttctttcaaacgtggtgagtttgtgctatcac +gtcaacggtagagctcagtggaccgagtgcgcgttcaaccctgttccagagagggtgtga +tagcacatataccacgctcgtcgaggcgttcatgatagtttgcaagagccggtgttaaac +acatattattattgttatccaactaatcggacctatgcataaagcattgtctaaacagaa +taattgcctatatacggtagttttagtgatttatatcttagtatcagttagagcttcgaa +ctcttcaggttcctcatatttaacgttcttcgaaagcgaaaacttctacaaacgaatgta +agcggttttccaagtagtacctataaatcacagaaagatctgtctcagtatagttgaaat +ggtattcagctagtgacgtgtaccaattatcatagttcactcaagcaagacgctcattaa +cgaatatagacaagacactatatcatataataaaaaagaacatggtgctcgaacatagtt +gaattcaccatattgaaggggaatgctgacatgtaattcgctactagacgatcaattccc +tacttgtcaaagttgaactggtacgttcttggaattaaatatgattgcgctggaccaaat +tgcgacttcttgagtttcagggcaaacgattgagccggaggatgtccgtctcttaccttt +cttgcttatgataaacgacggtccctgtacatcactgggaattctcagcaaaaataattg +ggtaaatcgagactcgatgtattcggccacaaaggtgttagacgttaaagattattcaac +ggggcgataataggatcataaccggtatgcaagcgcattgaaagagccatgagatcctta +tccgataaacgctgcacggtatgtgcagccttattgtcgatcacgaatttataaatgtag +tctgggctgtaagttgaagacctaagttataatgaagtgcaataccaaatcgattcatag +tggattatcagactcaagatatctcctgataaattacagttgttaagatacggataaaat +gagatttaagattagcagcctctaatctgtttcaatcccgttggaatgtggtatgcgatc +aaggttaagttaaaatcaagcctgtcttcagtcttgattcttgttctgccatcgcatgcg +gtctacgtgagttaatatgtagcttacgttctagcttgtgctaatctgagtatagattcg +tagaggaatattatcaagcttccacgcctcaacgtacgtgtattggtcacacaagacact +aaaagtggaagtagcgtaaactatagtctagttgttaaatgctcagttcttgttatattc +gatatactcttggctaatttatgtctgagtatataaaattaatgatattaacttgcattt +cacggatcccttagaaaaagattttgaccgagcgcattataaacggttacaccgaatcaa +tagaagcatacccaatagctttctttgaatttattgcctgcgcaacttggctgactctct +agatccgaataattctatatggtcgtgacgaaactagttcattactgtttaaaatgccaa +catgtcttttgggccgataatggctctttgcaaaattactcaatgatacgattgatcaaa +gcggtagttgctagtggtagcatgtaagtctatcaaatgtctgattatccgaaaatcttc +caaaagagtccacgtaccatatctatctcatagcgacgcgaggggaaccttatctaacta +tcattccatttaccgggtgactctcgatgcaggatccgattgggataaattgcccagaaa +tggctcattcctgactaagggtaaggccgttctcagcaagggaaccccgcgaatctaggc +ttataccatctagattgttaactacttgcctgtagttctacagccatactggacagttgt +ttctaaatgatcgggattcatgctagcactcctctgaatgcaccgcgtaagtttaactat +tacgtccgtgggcagataaggatggaggctgtatgtatcttaactgttacctaatatggc +tggtaattatcaaagtaaggaccttaatgccatagcgctagcaatcgctttgtatactga +ccatgtgccaacctctcttaatctgtaaaatataatgtcttagctaactgtggacgatca +tgtctctgcctagagcttcgctgtatcaattcctatagccagcgtactagtgacacaaca +acaccgtgtgagaaaagatattagtccttacgtctgtctctctacagcttattgatgagg +attgaacatggacatatagctccccctcaaaagcagatgctacctctttattccattctc +gaacatttgccgaacttaatttcgacaaacctgaggtcacgtcttaatttatcggtaacg +tcacgtccctttgagactggataaatatattaccaggggccaacgagcaattgttggagg +cgcttctataatacaaggtgtcttgtcaaagaaagacggcgtgcgtctcgtgcaactcac +ttaaccaatattaatgtgaaacccccctctctcacatcttatgcggtgtactgccctggt +acatttcctgtacaggactccaacagtgtagattcctaagatagctgttggagttgcctc +acgccagatcgaaaaactgaataaactagtgagctgagctgcagaaataccgcttaatta +cttatgactagttcaaagggacctacgtgatgtcagacattgcaaggaagaaattaggtt +tgtgcgtcattttggctggactagcactccttacttcccctactattcaaatgtcgtaaa +cagcatgagacaggatcgtgctgacatttaaggtctattgggaacgaggctacctttggt +cgcgcgctcgcgttctccgaatgaccgaaatgcatgagcacagtatgcaattgcttatag +atctaaggtctggtcgttgaaaccaagcacgtaggcctgggaaatcagttcttcctcagc +aactacacaaaagcgtccaagcattagtacttgtagtaaatgtccgaacctatgcgctca +tttgaaagtcaaaaaatatttttaagcagtaggcacctaacccgattcctctacttagta +gctttctttgattctcagaattgactgcaatatcactgcacaattctgtgccattactag +acttctctgtattaacgtctcatcttactaacactcgcctaggacacatctgagagtgaa +gtatttcaatacatttactgaaatcttcagttctaaaatccccgaataaggctcttatcg +gtttggccaacacaagaaaaaaacttcttgcaccactcaccttcatacgcaggagcctgg +ggaacttagtaataactatttcggcagacaaagcttataacaagttgccggcgcgtataa +tatttaaaagaccccttgagctgctcaattaaaacgctcacctggtataggctattagat +agtgccgtcttagtaaggggcgggaattatcggataaactgatattttgataaaataacc +gacttgttcacgacataagtcactaaggagattttatctttctccaaagtatatcttcct +tggataatttcaaagcgctgcaatttaagttctgttactagtttatgctgctgggaggtg +accggaaggcgtagtaatctagaggcaaattataagaagttcatcatatcattttcgact +acaaaaacaaggtgttgtatgccggcgcattgtgtaaactggacgagtaccctagatgga +aaattatacgttaagccaagatttcgatgtaatgataattacctacacatttttgctatc +cataggaacaagagctgttctataggctcgtggcatacgaacatttgctgccgctatgaa +tattggaagctcttcaactacagactctattcttaattgccgtcgaaaatgggccgaatc +ggctattattaatactcggtttttccgaggggattgttgtcgacagtcgtaattattatt +aatattgatgttggtgaggtcatttaaatacaaccttgcagacaatgaataagggatcca +atctctcatactccttttacaattgctcatgcccctatgcaaaccttatgccgccacacc +tccgcaactctctcttctgaactgtaagtagcttcattactggtttgagactatactgaa +gctgatgacattctaaaatggctattttcgaatgtgattcataatgtttatcgtttggga +tggcagaatcacgttatttttgatatagcccgggtattctattgtatagaacgtatgcta +caagtcattccccgaagaagactagaagtaaacaacatgcgaccatcgttaagccacgca +aggctgtagctttatttcccgataacctatcttccataaatagcggacagcaggatactg +acgctcaacatcagtggttatggtctaatttttaacttttaataaggtaacttcagcagg +catacacagtaactctttaatttataatcaaattagaagtctgacacttcttatattttt +ctatcatccaacgcgatcgcccattagcttattgtgttactaataacgtatctaaaccaa +tccttttcaagctactgcctatattgtcaatatatacaaacaacaggatagtaggctgct +taaaaaatattgtcaaccgtgtacgctttacaatacccggaaatcacaaactttgtagac +aacgagtgaaatttatacactacgaagggccagcgtacaagacccatgaattaggcgata +tgtttattctgacatattggtttatccttaatctgtcgctgtaaaatgaagccgccccca +tccctgcgaattttttttcgaagattcacgactgaaatataaatacgtttggctatattt +atgttggagggaggcaatagcctttactgttaaccgaagatttagccagtgagtgtgaca +ctaaaacactggaataaatgcaggcgttcttctgggtaaaaggtttagtcaatctcgcct +ataagttcatatagctctggatataattatctggcccatgcatttatcatggcgcttggt +gccctgtgtgaagccggcctctcatattgaaggtccgaagtattccatgtacattaagat +cactctctcattcatgcatcttggcttaacaaatctggttgtccaagctttccaggcacg +tatggtacaaattcggatcgaatacttataaaaatgatatgttaaactgtctaaaacgct +catctacaaagtaaagtgcactaaccaatagagtctcaagaccgtgtaatgctggtgcac +tgaatgtgtaatacggttagaagggattagttatgttacaaatccattgaaaacttaaga +agcattgcgtgctcggagggtgcatcttttatcaagagactaacattattttcaacgacg +tacatgctttacaatagggtacttatcaaacgccgagaaacgcgcctatagtgatgttat +gattatgacccgatatccattggaccgaattttatgtaggttcccagcgtactcgcgtaa +tatctcggtattgccataatgtaatacttgtcggtctctcccagatgaaaaagcgttaca +gagtatttcaatgaaaaacagcgcgcaacgtcaatacctttaggggtaacggccgctgat +ttcatatagatatacgataagttggtatagctctactaggtggcatccacaatcgttgca +tttactatagctggttacaatcataatctataccgttccttacatactaccatagcggga +tagcgtttttttgccgttgattgggtttaagaggatgtcagtctcattatatccgattcg +gtgggagagccgttgttttcaaatcgcacactttgtgacataatgtacaagataacaaaa +ctgatataagatataaactgtcaatatcaccttgacacttgaatcaaagtaaattaactc +gcaaatataatttgactaattgggtgcagatttctcaattaataaaaaaatggcaccgga +tgggcttacaagccccttatcattcacttgtatcatgatttccaagaacaatagaatttg +ctagcaagtatgaacagagattcgaattgcatccacagtacgccggagcgtttattttaa +tgtggatatgacgatgtactgttggcggcatttgctagtaaccggtccttatttacgtag +cgcacacgtaagcatgtctgggagaaatatggtggtacaatctcagagaaagattacagt +ttggtttaaataggacttatcgggtcggaagtggaacttaataagcagtacacaattggg +caacagacgtcttgcctattacaataggattacaatgcgttagatttcagacacgttcgt +gtttggctattcgtcaattccctaaatagttagacgatcaactattatcaaagtgattct +ttgttcatcctccattcatgtaacagatggcacactacgcataacgccgaggaattttaa +cgagatttaagagagcagttcgggcacaacccacttgactttataacagctcggcagcat +aaacggtaatatgtgacaaatttccaaacgttataagaacgtatgtgtacttagaaaact +aagtggttcatgttcaacagatgtgacgcagcaagcctaacttatctattggttttgcta +taaaagaacaaagttacacagaatcctaagggcttgtttcacacttatgcctagtgcttc +accatcttaaaatagcgaaaccggcacgaatcaaaccttaaaacaatgcgcagatattgg +tgatggtgactccgggtatgataatggtaactgttgaccagcgcccacctcatcgaagta +tagaaagtggttaggataaggatgagaccgaacttatttccggccataactttagatttt +ctacctagtacacaacatcagggcggacacgaaaccgccatcacatcatataccaggttt +aatttgcttaatgggggaagtgtcaacgaaccttcgaactttagcaggcatatggccatt +atatatggccccagagcagaatgctacagcagacaaaatttggatttatgtagtttaata +cctatcaaacttggtgtgaccatacttgtctaacgacagtgcacaaagtgtaagttacaa +ttattactactcagcagcttctgcaatgataaaatcttatcatacacgtcacatatgata +atatctacttagggggaacgggctccacaacctacatagtactcaatacttacactattc +gacaggcacaccaaacctgtacagtcccaaaagattgagtcaactttgcagtactgcaga +tcacagtaatagcttagttagcgagtcaaaattagttttctacgagactgcacgaccgtg +caaatttccgatgtgttggctacaaatagcaacgtatgaatttgtttgaagccacgtaaa +ctgtacaaccttagagataagtctcaggctactaaaaacacgttgtggcactaacaggat +catggttgattcttacttattcggctgaccggcccaataagtaaccttcaactagaacag +aataatcgggagtagtttaattcagtcaaggtgcaggtctcattgtaactaacaagctct +gtgtaaccaagttaaaatcgttttcttagcggattccctacttatggatttgagctcgtc +cacaatattcgatacaagaagtttgtggtccgtaacaacgaaattttaattacgctgtgc +agcctcatccaaggaattaatagaaggttgatggtaggctccgaacgctccatgattata +atcaagtggactgtgcagtaaacgaggaaggtatcctgacgtcgtggtgttcgtttttgt +tatttgtgccctatacgagtagataaaccatgaacagcacagtgtgaacccatggttgat +tttaggctaccttatttttaatttccgttacacagaaacgaattccacaactaacatgcc +attaatttttcgatatcttataaaagatggtcgaaattcattcatttattttttttcggt +tctcgaaagtcaactaagctgtcgcgttttgtttctctttagaggtaaaagtggctttga +tctcctacgtttggatactagtcaaccattactccatttgatccgtgagtatcacctgtc +taacatccagcattatgactcctcggcgaagaaaagacacacttcttagagtcgatgtgt +attagctagggacacagttgtttaatacgatagtgagcccagggagggcagtgcgtcccc +cagtagatttattcagctagtgtaagtataagatatctcacccacgaggttcaagtgata +tgcagtcttagaataatacttatcctgaatttcgatattatgggtacttcaataatccgc +tagcgctactttatgtctcgttggacagcaggacacatggcagtcttaaacactaaagac +atcacctgaatgaatgtaatgggattacaagaatcaatgaggtattatatacgacgtagg +aaactctggatatatacagtaatctagttacgccatcgcacttcattcctctggaaactt +agaagacatcagctgtacgtggaggaaccagacccccgtatgtagccaaatagaaccaaa +gttgcttatacaaacacacccaatgacaatggaccgctggagttcgtaaactcggaacgt +agtactgcacaaacccagcatttagcaataggagctacgtatgcaactcccacgtggtaa +taccttcaagctatcaatatataggtgcctagctaatcgcattcgcaagcagtattcaag +cttgtaaaccagtataataattacagaggctctatgaaacccaactttccagctaaaagt +cccaattaaatggttatttc diff --git a/benchmarks/shootout/knucleotide-output.txt b/benchmarks/shootout/knucleotide-output.txt new file mode 100644 index 00000000..072e3660 --- /dev/null +++ b/benchmarks/shootout/knucleotide-output.txt @@ -0,0 +1,27 @@ +A 30.279 +T 30.113 +G 19.835 +C 19.773 + +AA 9.161 +AT 9.138 +TA 9.108 +TT 9.060 +CA 6.014 +GA 5.996 +AG 5.993 +AC 5.988 +TG 5.987 +GT 5.967 +TC 5.958 +CT 5.948 +GG 3.944 +GC 3.928 +CG 3.910 +CC 3.899 + +1474 GGT +459 GGTA +49 GGTATT +1 GGTATTTTAATT +1 GGTATTTTAATTTATAGT diff --git a/benchmarks/shootout/knucleotide.chibi b/benchmarks/shootout/knucleotide.chibi new file mode 100644 index 00000000..ff64b447 --- /dev/null +++ b/benchmarks/shootout/knucleotide.chibi @@ -0,0 +1,86 @@ +#! /usr/bin/env chibi-scheme + +;;; The Computer Language Benchmarks Game +;;; http://shootout.alioth.debian.org/ + +;;; based on Racket version by Matthew Flatt + +(import (scheme) + (srfi 69) + (srfi 95) + (chibi io)) + +(define (print . args) + (for-each display args) + (newline)) + +(define (string-copy! dst dstart src start end) + (do ((i dstart (+ i 1)) + (j start (+ j 1))) + ((>= j end)) + (string-set! dst i (string-ref src j)))) + +(define (string-upcase str) + (let* ((len (string-length str)) + (res (make-string len))) + (do ((i 0 (+ i 1))) + ((>= i len) res) + (string-set! res i (char-upcase (string-ref str i)))))) + +(define (all-counts len dna) + (let ((table (make-hash-table eq?)) + (seq (make-string len))) + (do ((s (- (string-length dna) len) ( - s 1))) + ((< s 0) table) + (string-copy! seq 0 dna s (+ s len)) + (let ((key (string->symbol seq))) + (let ((cnt (hash-table-ref/default table key 0))) + (hash-table-set! table key (+ cnt 1))))))) + +(define (write-freqs table) + (let* ((content (hash-table->alist table)) + (total (exact->inexact (apply + (map cdr content))))) + (for-each + (lambda (a) + (print (car a) " " + (/ (round (* 100000.0 (/ (cdr a) total))) 1000.0))) + (sort content > cdr)))) + +(define (write-one-freq table key) + (print (hash-table-ref/default table key 0) "\t" key)) + +(define dna + (let ((in (current-input-port))) + ;; Skip to ">THREE ..." + (let lp () + (let ((line (read-line in))) + (cond ((eof-object? line)) + ((and (>= (string-length line) 6) + (eqv? #\> (string-ref line 0)) + (equal? (substring line 0 6) ">THREE"))) + (else (lp))))) + (let ((out (open-output-string))) + ;; Copy everything but newlines to out: + (let lp () + (let ((line (read-line in))) + (cond ((eof-object? line)) + (else + (display line out) + (lp))))) + ;; Extract the string from out: + (string-upcase (get-output-string out))))) + +;; 1-nucleotide counts: +(write-freqs (all-counts 1 dna)) +(newline) + +;; 2-nucleotide counts: +(write-freqs (all-counts 2 dna)) +(newline) + +;; Specific sequences: +(for-each + (lambda (seq) + (write-one-freq (all-counts (string-length seq) dna) + (string->symbol seq))) + '("GGT" "GGTA" "GGTATT" "GGTATTTTAATT" "GGTATTTTAATTTATAGT")) diff --git a/chibi-scheme.vcproj b/chibi-scheme.vcproj new file mode 100644 index 00000000..86bd69e9 --- /dev/null +++ b/chibi-scheme.vcproj @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/contrib/bash_completion b/contrib/bash_completion new file mode 100644 index 00000000..021a4d65 --- /dev/null +++ b/contrib/bash_completion @@ -0,0 +1,69 @@ +# bash -*- shell-script -*- completion for chibi-scheme + +type chibi-scheme >/dev/null 2>/dev/null && { + +_chibi-modules() { + for dir in ./lib/ /usr/local/share/chibi/ "$@" \ + $(echo $CHIBI_MODULE_PATH | tr ':' ' '); do + find "$dir" -name \*.sld 2>/dev/null \ + | sed 's!'"$dir"'/*!!;s!\.sld$!!;s!/!.!g' + done | sort -u +} + +_chibi-scheme() { + local cur prev + # Just some likely sample sizes, you're not limited to these. + local sizes="1M 2M 4M 8M 16M 32M 64M 128M 256M 512M 1G 2G 4G" + + COMPREPLY=() + + # We don't require a space between single-char options and the value. + cur=`_get_cword` + case "$cur" in + -m*) + COMPREPLY=( $( compgen -W "$(_chibi-modules | sed 's!^!-m!')" -- "$cur") ) + return 0;; + -x*) + COMPREPLY=( $( compgen -W "$(_chibi-modules | sed 's!^!-x!')" -- "$cur") ) + return 0;; + -l*) + compopt -o nospace + _filedir + return 0;; + -A*) + compopt -o nospace + COMPREPLY=( $( compgen -d -- "${cur#-A}" | sed 's!^!-A!' ) ) + return 0;; + -I*) + compopt -o nospace + COMPREPLY=( $( compgen -d -- "${cur#-I}" | sed 's!^!-I!' ) ) + return 0;; + -h*) + COMPREPLY=( $( compgen -W "$(echo $sizes | tr ' ' '\n' | sed 's!^!-h!')" -- "${cur}" ) ) + return 0;; + -) + COMPREPLY=( $( compgen -W '-d -e -f -h -i -l -m -p -q -x -A -I -V' \ + -- "$cur") ) + return 0;; + -*) + return 0;; + esac + + # Not connected to the option, check the previous word. + prev=${COMP_WORDS[COMP_CWORD-1]} + case "$prev" in + -[mx]) + COMPREPLY=( $( compgen -W "$(_chibi-modules)" -- "$cur") ) + return 0;; + -[AIl]) + _filedir + return 0;; + -h) + COMPREPLY=( $( compgen -W "$sizes" -- "$cur" ) ) + return 0;; + esac +} + +complete -f -F _chibi-scheme chibi-scheme + +} diff --git a/doc/chibi-doc.1 b/doc/chibi-doc.1 new file mode 100644 index 00000000..b309f158 --- /dev/null +++ b/doc/chibi-doc.1 @@ -0,0 +1,40 @@ +.TH "chibi-doc" "1" "" "" +.UC 4 +.SH NAME +.PP +chibi-doc \- generate docs from Scheme scribble syntax + +.SH SYNOPSIS +.B chibi-doc +[ +.I file +] +.BR + +.B chibi-doc +.I dotted-name.of.module +.BR +.SP 0.4 + +.SH DESCRIPTION +.I chibi-doc +is a tool to generate documentation from the Scheme scribble syntax +from Racket. It works like a Unix filter, translating from the +current input or a file to standard output. You can also specify a +module name, with components separated with dots, and it will search +for the module and generate documentation from it automatically from +literate comments in the module or any of its source files. These +comments are any line beginning with the characters +.I ;;> + +The scribble syntax is described in the manual. + +.SH AUTHORS +.PP +Alex Shinn (alexshinn @ gmail . com) + +.SH SEE ALSO +.PP +The chibi-scheme home-page: +.BR +http://code.google.com/p/chibi-scheme/ diff --git a/doc/chibi-ffi.1 b/doc/chibi-ffi.1 new file mode 100644 index 00000000..00bca31a --- /dev/null +++ b/doc/chibi-ffi.1 @@ -0,0 +1,45 @@ +.TH "chibi-ffi" "1" "" "" +.UC 4 +.SH NAME +.PP +chibi-ffi \- generate C from Scheme stub files + +.SH SYNOPSIS +.B chibi-ffi +[-c] +[-f +.I +cflags +] +input.stub +[ +.I output.c +] +.BR +.SP 0.4 + +.SH DESCRIPTION +.I chibi-ffi +reads in the C function FFI definitions from an input file and outputs +the appropriate C wrappers into a file with the same base name and the +".c" extension. You can then compile that C file into a shared +library: + + chibi-ffi file.stub + cc -fPIC -shared file.c -lchibi-scheme + +If the -c option is specified then chibi-ffi attempts to compile the +generated C code for you in one step. In this case, additional flags +for the C compiler may be given with the -f option. + +The FFI syntax is described in the manual. + +.SH AUTHORS +.PP +Alex Shinn (alexshinn @ gmail . com) + +.SH SEE ALSO +.PP +The chibi-scheme home-page: +.BR +http://code.google.com/p/chibi-scheme/ diff --git a/doc/chibi-scheme.1 b/doc/chibi-scheme.1 new file mode 100644 index 00000000..da879cfb --- /dev/null +++ b/doc/chibi-scheme.1 @@ -0,0 +1,174 @@ +.TH "chibi-scheme" "1" "" "" +.UC 4 +.SH NAME +.PP +chibi-scheme \- a tiny Scheme interpreter + +.SH SYNOPSIS +.B chibi-scheme +[-qfV] +[-I +.I path +] +[-A +.I path +] +[-m +.I module +] +[-x +.I module +] +[-l +.I file +] +[-e +.I expr +] +[-p +.I expr +] +[-d +.I image-file +] +[-i +.I image-file +] +[--] +[ +.I script argument ... +] +.br +.sp 0.4 + +.SH DESCRIPTION +.I chibi-scheme +is a sample interactive Scheme interpreter for the +.I chibi-scheme +library. It serves as an example of how to embed +.I chibi-scheme +in applications, and can be useful on its own for writing +scripts and interactive development. + +When +.I script +is given, the script will be loaded with SRFI-22 semantics, +calling the procedure +.I main +(if defined) with a single parameter as a list of the +command-line arguments beginning with the script name. This +works as expected with shell #! semantics. + +Otherwise, if no script is given and no -e or -p options +are given an interactive repl is entered, reading, evaluating, +then printing expressions until EOF is reached. The repl +provided is very minimal - if you want readline +completion you may want to wrap it with the +.I rlwrap(1) +program. Signals aren't caught either - to enable handling keyboard +interrupts you can use the (chibi process) module. For a more +sophisticated REPL with readline support, signal handling, module +management and smarter read/write you may want to use the (chibi repl) +module. For example, +.I chibi-scheme -mchibi.repl -e'(repl)' + +The default language is an extended subset of the draft R7RS +(scheme base) module. To get exactly the base module, use +.I chibi-scheme -xscheme.base + +.SH OPTIONS +.TP 5 +.BI -V +Prints the version information and exits. +.TP +.BI -q +Don't load the initialization file. The resulting +environment will only contain the core syntactic forms +and primitives coded in C. +.TP +.BI -f +Change the reader to case-fold symbols as in R5RS. +.TP +.BI -h size[/max_size] +Specifies the initial size of the heap, in bytes, +optionally followed by the maximum size the heap can +grow to. +.I size +can be any integer value, optionally suffixed by +"K", for kilobytes, "M" for megabytes, or "G" for gigabytes. +.I -h +must be specified before any options which load or +evaluate Scheme code. +.TP +.BI -I path +Inserts +.I path +on front of the load path list. +.TP +.BI -A path +Appends +.I path +to the load path list. +.TP +.BI -m module +.TP +.BI -x module +Imports +.I module +as though "(import +.I module +)" were evaluated. However, to reduce the need for shell +escapes, modules are written in a dot notation, so that the module +.I (foo bar) +is written as +.I foo.bar +If the +.BI -x +version is used, then +.I module +replaces the current environment instead of being added to it. +.TP +.BI -l file +Loads the Scheme source from the file +.I file +searched for in the default load path. +.TP +.BI -e expr +Evaluates the Scheme expression +.I expr. +.TP +.BI -p expr +Evaluates the Scheme expression +.I expr +then prints the result to stdout. +.TP +.BI -d image-file +Dumps the current Scheme heap to +.I image-file +and exits. This feature is still experimental. +.TP +.BI -i image-file +Loads the Scheme heap from +.I image-file +instead of compiling the init file on the fly. +This feature is still experimental. + +.SH ENVIRONMENT +.TP +.B CHIBI_MODULE_PATH +.TQ +A colon separated list of directories to search for module +files, inserted before the system default load paths. + +.SH AUTHORS +.PP +Alex Shinn (alexshinn @ gmail . com) + +.SH SEE ALSO +.PP +More detailed information can be found in the README file +included in the distribution. + +The chibi-scheme home-page: +.br +http://code.google.com/p/chibi-scheme/ diff --git a/doc/chibi.scrbl b/doc/chibi.scrbl new file mode 100755 index 00000000..b21ebc14 --- /dev/null +++ b/doc/chibi.scrbl @@ -0,0 +1,1149 @@ +@; #lang scribble/manual + +@title{Chibi-Scheme} +@author{Alex Shinn} + +@centered{@smaller{Minimal Scheme Implementation for use as an Extension Language}} +@centered{@url{http://synthcode.com/wiki/chibi-scheme/}} + +@section{Introduction} + +Chibi-Scheme is a very small library intended for use as an extension +and scripting language in C programs. In addition to support for +lightweight VM-based threads, each VM itself runs in an isolated heap +allowing multiple VMs to run simultaneously in different OS threads. + +The default language is an extended subset of the current draft R7RS +Scheme, with support for all libraries. Support for additional +languages such as JavaScript, Go, Lua and Bash are planned for future +releases. Scheme is chosen as a substrate because its first class +continuations and guaranteed tail-call optimization makes implementing +other languages easy. + +The system is designed in optional layers, beginning with a VM based +on a small set of opcodes, a set of primitives implemented in C, a +default language, a module system implementation, and a set of +standard modules. You can choose whichever layer suits your needs +best and customize the rest. Adding your own primitives or wrappers +around existing C libraries is easy with the C FFI. + +Chibi is known to build and run on 32 and 64-bit Linux, FreeBSD, OS X, +iOS, Windows (under Cygwin) and Plan9. + +@section{Installation} + +To build, just run "make". This will provide a shared library +"libchibi-scheme", as well as a sample "chibi-scheme" command-line +repl. The "chibi-scheme-static" make target builds an equivalent +static executable. If your make doesn't support GNU make +conditionals, then you'll need to edit the top of the Makefile to +choose the appropriate settings. On Plan9 just run "mk". You can +test the build with "make test". + +To install run "make install". If you want to try the executable out +without installing, you will probably need to set LD_LIBRARY_PATH, +depending on your platform. If you have an old version installed, +run "make uninstall" first, or manually delete the directory. + +You can edit the file chibi/features.h for a number of settings, +mostly disabling features to make the executable smaller. You can +specify standard options directly as arguments to make, for example + +@command{make CFLAGS=-Os CPPFLAGS=-DSEXP_USE_NO_FEATURES=1} + +to optimize for size, or + +@command{make LDFLAGS=-L/usr/local/lib CPPFLAGS=-I/usr/local/include} + +to compile against a library installed in /usr/local. + +By default Chibi uses a custom, precise, non-moving GC (non-moving is +important so you can maintain references from C code). You can link +against the Boehm conservative GC by editing the features.h file, or +directly from make with: + +@command{make SEXP_USE_BOEHM=1} + +To compile a static executable, use + +@command{make chibi-scheme-static SEXP_USE_DL=0} + +To compile a static executable with all C libraries statically +included, first you need to create a clibs.c file, which can be done +with: + +@command{make clibs.c} + +or edited manually. Be sure to run this with a non-static +chibi-scheme. Then you can make the static executable with: + +@command{ +make -B chibi-scheme-static SEXP_USE_DL=0 CPPFLAGS=-DSEXP_USE_STATIC_LIBS +} + +@subsection{Compile-Time Options} + +The include file @ccode{"chibi/features.h"} describes a number of +C preprocessor values which can be enabled or disabled by setting to +1 or 0 respectively. For example, the above commands used the +features @ccode{SEXP_USE_BOEHM}, @ccode{SEXP_USE_DL} and +@ccode{SEXP_USE_STATIC_LIBS}. Many features are still experimental +and may be removed from future releases, but the important features +are listed below. + +@itemlist[ +@item{@ccode{SEXP_USE_BOEHM} - link with the Boehm GC instead of the native Chibi GC} +@item{@ccode{SEXP_USE_DL} - allow dynamic linking (enabled by default)} +@item{@ccode{SEXP_USE_STATIC_LIBS} - compile the standard C libs statically} +@item{@ccode{SEXP_USE_MODULES} - use the module system} +@item{@ccode{SEXP_USE_GREEN_THREADS} - use lightweight threads (enabled by default)} +@item{@ccode{SEXP_USE_SIMPLIFY} - use a simplification optimizer pass (enabled by default)} +@item{@ccode{SEXP_USE_BIGNUMS} - use bignums (enabled by default)} +@item{@ccode{SEXP_USE_FLONUMS} - use flonums (enabled by default)} +@item{@ccode{SEXP_USE_RATIOS} - use exact ratios (enabled by default)} +@item{@ccode{SEXP_USE_COMPLEX} - use complex numbers (enabled by default)} +@item{@ccode{SEXP_USE_UTF8_STRINGS} - Unicode support (enabled by default)} +@item{@ccode{SEXP_USE_NO_FEATURES} - disable almost all features} +] + +@subsection{Installed Programs} + +The command-line programs @ccode{chibi-scheme}, @ccode{chibi-doc} and +@ccode{chibi-ffi} are installed by default, along with manpages. +@ccode{chibi-scheme} provides a REPL and way to run scripts. In the +interest of size it has no --help option - see the man page for usage. +@ccode{chibi-doc} is the command-line interface to the literate +documentation system described in +@hyperlink["lib/chibi/scribble.html"]{(chibi scribble)}, and used to +build this manual. @ccode{chibi-ffi} is a tool to build wrappers for +C libraries, described in the FFI section below. + +@section{Default Language} + +@subsection{Scheme Standard} + +The default language is based on the latest draft of +@hyperlink["http://scheme-reports.org/"]{R7RS}, which is mostly a +superset of +@hyperlink["http://www.schemers.org/Documents/Standards/R5RS/HTML/"]{R5RS}. +Some of the more expensive bindings are not included in the interest +of size and quick startup, and some extra low-level utilities are +included for convenience and bootstrapping. Note the builtin +@scheme{equal?} does not support cyclic structures (you need the R7RS +@scheme{(scheme base)} or @scheme{(chibi equiv)}), nor do the default +reader and writer (you need @scheme{(srfi 38)} or the R7RS +@scheme{(scheme read)} and @scheme{(scheme write)}). + +To get the exact R7RS language, you can @scheme{(import (scheme base))}, +and likewise for the other R7RS libraries. + +The reader defaults to case-sensitive, like R6RS and R7RS but unlike +R5RS. The default configuration includes the full numeric tower: +fixnums, flonums, bignums, exact rationals and complex numbers. + +Full continuations are supported, but currently continuations don't +take C code into account. This means that you can call from Scheme to +C and then from C to Scheme again, but continuations passing through +this chain may not do what you expect. The only higher-order C +functions (thus potentially running afoul of this) in the standard +environment are @scheme{load} and @scheme{eval}. The result of +invoking a continuation created by a different thread is also +currently unspecified. + +In R7RS (and R6RS) semantics it is impossible to use two macros from +different modules which both use the same auxiliary keywords (like +@scheme{else} in @scheme{cond} forms) without renaming one of the +keywords. By default Chibi considers all top-level bindings +effectively unbound when matching auxiliary keywords, so this case +will "just work". This decision was made because the chance of +different modules using the same keywords seems more likely than user +code unintentionally matching a top-level keyword with a different +binding, however if you want to use R7RS semantics you can compile +with @ccode{SEXP_USE_STRICT_TOPLEVEL_BINDINGS=1}. + +@scheme{load} is extended to accept an optional environment argument, like +@scheme{eval}. You can also @scheme{load} shared libraries in addition to +Scheme source files - in this case the function @cfun{sexp_init_library} is +automatically called with the following signature: + +@ccode{ + sexp_init_library(sexp context, sexp self, sexp_sint_t n, sexp environment, + const char* version, sexp_abi_identifier_t abi); +} + +The following additional procedures are available in the default +environment: + +@itemlist[ +@item{@scheme{(print-exception exn out)} - prints a human-readable description of @var{exn} to the output port @var{out}} +@item{@scheme{(port-fold-case? port)} - returns @scheme{#t} iff the given input port folds case on @scheme{read}} +@item{@scheme{(set-port-fold-case! port bool)} - set the case-folding behavior of @var{port}} +@item{@scheme{(string-concatenate list-of-strings [sep])} - append the strings joined by @var{sep}} +] + +@subsection{Module System} + +Chibi uses the R7RS module system natively, which is a simple static +module system in the style of the +@hyperlink["http://s48.org/"]{Scheme48} module system. As with most +features this is optional, and can be ignored or completely disabled +at compile time. + +Modules names are hierarchical lists of symbols or numbers. A module +definition uses the following form: + +@schemeblock{ + (define-library (foo bar baz) + ...) +} + +where @var{} can be any of + +@schemeblock{ + (export ...) ;; specify an export list + (import ...) ;; specify one or more imports + (begin ...) ;; inline Scheme code + (include ...) ;; load one or more files + (include-shared ...) ;; dynamic load a library +} + +@var{} can either be a module name or any of + +@schemeblock{ + (only ...) + (except ...) + (rename ( ) ...) + (prefix ) +} + +These forms perform basic selection and renaming of individual +identifiers from the given module. They may be composed to perform +combined selection and renaming. + +Some modules can be statically included in the initial configuration, +and even more may be included in image files, however in general +modules are searched for in a module load path. The definition of the +module @scheme{(foo bar baz)} is searched for in the file +@scheme{"foo/bar/baz.sld"}. The default module path includes the +installed directories, @scheme{"."} and @scheme{"./lib"}. Additional +directories can be specified with the command-line options @ccode{-I} +and @ccode{-A} (see the command-line options below) or with the +@scheme{add-modue-directory} procedure at runtime. You can search for +a module file with @scheme{(find-module-file )}, or load it with +@scheme{(load-module-file )}. + +Within the module definition, files are loaded relative to the .sld +file, and are written with their extension (so you can use whatever +suffix you prefer - .scm, .ss, .sls, etc.). + +Shared modules, on the other hand, should be specified @emph{without} the +extension - the correct suffix will be added portably (e.g. .so for Unix and +.dylib for OS X). + +You may also use @scheme{cond-expand} and arbitrary macro expansions in a +module definition to generate @var{}. + +@subsection{Macro System} + +@scheme{syntax-rules} macros are provided by default, with the extensions from +@hyperlink["http://srfi.schemers.org/srfi-46/srfi-46.html"]{SRFI-46}. +In addition, low-level hygienic macros are provided with a +syntactic-closures interface, including @scheme{sc-macro-transformer}, +@scheme{rsc-macro-transformer}, and @scheme{er-macro-transformer}. A good +introduction to syntactic-closures can be found at +@url{http://community.schemewiki.org/?syntactic-closures}. + +@scheme{identifier?}, @scheme{identifier->symbol}, @scheme{identifier=?}, and +@scheme{make-syntactic-closure} and @scheme{strip-syntactic-closures} are +also available. + +@subsection{Types} + +You can define new record types with +@hyperlink["http://srfi.schemers.org/srfi-9/srfi-9.html"]{SRFI-9}, or +inherited record types with +@hyperlink["http://srfi.schemers.org/srfi-99/srfi-99.html"]{SRFI-99}. +These are just syntactic sugar for the following more primitive type +constructors: + +@schemeblock{ +(register-simple-type ) + => + +(make-type-predicate ) + => ; takes 1 arg, returns #t iff that arg is of the type + +(make-constructor ) + => ; takes 0 args, returns a newly allocated instance of type + +(make-getter ) + => ; takes 1 args, retrieves the field located at the index + +(make-setter ) + => ; takes 2 args, sets the field located at the index +} + +@subsection{Unicode} + +Chibi supports Unicode strings, encoding them as utf8. This provides easy +interoperability with many C libraries, but means that @scheme{string-ref} and +@scheme{string-set!} are O(n), so they should be avoided in +performance-sensitive code. + +In general you should use high-level APIs such as @scheme{string-map} +to ensure fast string iteration. String ports also provide a simple +way to efficiently iterate and construct strings, by looping over an +input string or accumulating characters in an output string. + +The @scheme{in-string} and @scheme{in-string-reverse} iterators in the +@scheme{(chibi loop)} module will also iterate over strings +efficiently while hiding the low-level details. + +In the event that you do need a low-level interface, such as when +writing your own iterator protocol, you should use the following +string cursor API instead of indexes. + +@itemlist[ +@item{@scheme{(string-cursor-start str)} +@p{returns a start cursor for the string}} +@item{@scheme{(string-cursor-end str)} +@p{returns a cursor one past the last valid cursor}} +@item{@scheme{(string-cursor-ref str cursor)} +@p{get the char at the given cursor}} +@item{@scheme{(string-cursor-next str cursor)} +@p{increment to the next cursor}} +@item{@scheme{(string-cursor-prev str cursor)} +@p{decrement to the previous cursor}} +@item{@scheme{(substring-cursor str cs1 [cs2])} +@p{take a substring from the given cursors}} +@item{@scheme{(string-cursor? cs1 cs2)} +@p{cs1 is after cs2}} +@item{@scheme{(string-cursor>=? cs1 cs2)} +@p{cs1 is the same or after cs2}} +] + +@section{Embedding in C} + +@subsection{Quick Start} + +To use Chibi-Scheme in a program you need to link against the +"libchibi-scheme" library and include the "eval.h" header file: + +@ccode{#include } + +All definitions begin with a "sexp_" prefix, or "SEXP_" for constants. +In addition to the prototypes and utility macros, this includes the +following type definitions: + +@itemlist[ +@item{@ctype{sexp} - an s-expression, used to represent all Scheme objects} +@item{@ctype{sexp_uint_t} - an unsigned integer using as many bits as sexp} +@item{@ctype{sexp_sint_t} - a signed integer using as many bits as sexp} +] + +A simple program might look like: + +@ccodeblock{ +void dostuff(sexp ctx) { + /* declare and preserve local variables */ + sexp_gc_var2(obj1, obj2); + sexp_gc_preserve2(ctx, obj1, obj2); + + /* load a file containing Scheme code */ + obj1 = sexp_c_string(ctx, "/path/to/source/file.scm", -1); + sexp_load(ctx, obj1, NULL); + + /* eval a C string as Scheme code */ + sexp_eval_string(ctx, "(some scheme expression)", -1, NULL); + + /* construct a Scheme expression to eval */ + obj1 = sexp_intern(ctx, "my-procedure", -1); + obj2 = sexp_cons(ctx, obj1, SEXP_NULL); + sexp_eval(ctx, obj2, NULL); + + /* release the local variables */ + sexp_gc_release2(ctx); +} + +int main(int argc, char** argv) { + sexp ctx; + ctx = sexp_make_eval_context(NULL, NULL, NULL, 0, 0); + sexp_load_standard_env(ctx, NULL, SEXP_SEVEN); + sexp_load_standard_ports(ctx, NULL, stdin, stdout, stderr, 0); + dostuff(ctx); + sexp_destroy_context(ctx); +} +} + +Looking at @cfun{main}, @cfun{sexp_make_eval_context} and +@cfun{sexp_destroy_context} create and destroy a "context", which +manages the heap and VM state. The meaning of the arguments is +explained in detail below, but these values will give reasonable +defaults, in this case constructing an environment with the core +syntactic forms, opcodes, and standard C primitives. + +This is still a fairly bare environment, so we call +@cfun{sexp_load_standard_env} to find and load the default +initialization file. + +The resulting context can then be used to construct objects, call +functions, and most importantly evaluate code, as is done in +@cfun{dostuff}. The default garbage collector for Chibi is precise, +which means we need to declare and preserve references to any +temporary values we may generate, which is what the +@cmacro{sexp_gc_var2}, @cmacro{sexp_gc_preserve2} and +@cmacro{sexp_gc_release2} macros do (there are similar macros for +values 1-6). Precise GCs prevent a class of memory leaks (and +potential attackes based thereon), but if you prefer convenience then +Chibi can be compiled with a conservative GC and you can ignore these. + +The interesting part is then the calls to @cfun{sexp_load}, +@cfun{eval_string} and @cfun{eval} which evaluate code stored in +files, C strings, or represented as s-expressions respectively. + +Destroying a context runs any finalizers for all objects in the heap +and then frees the heap memory (but has no effect on other contexts +you or other users of the library may have created). + +@subsection{Contexts and Evaluation} + +Contexts represent the state needed to perform evaluation. This includes +keeping track of the heap (when using precise GC), a default environment, +execution stack, and any global values. A program being evaluated in one +context may spawn multiple child contexts, such as when you call @scheme{eval}, +and each child will share the same heap and globals. When using multiple +interpreter threads, each thread has its own context. + +You can also create independent contexts with their own separate heaps. These +can run simultaneously in multiple OS threads without any need for +synchronization. + +@itemlist[ + +@item{@ccode{sexp_make_context(sexp ctx, size_t size, size_t max_size)} +@p{ +Creates a new context object. The context has no associated environment, and +so cannot be used for evaluation, but can be used to construct Scheme objects +and call primitive C functions on them. + +If @var{ctx} is non-NULL it becomes the "parent" context. The resulting +context will share the same heap as its parent, and when using a precise GC +preserve any variables preserved by the parent, but the parent will not +preserve the child context by default. Typically you either preserve the child +manually or use it to perform a single sub-task then discard it and return to +using only the parent. + +Otherwise, a new heap is allocated with @var{size} bytes, expandable to a +maximum of @var{max_size} bytes, using the system defaults if either is 0. +}} + +@item{@ccode{sexp_make_eval_context(sexp ctx, sexp stack, sexp env, sexp_uint_t size, sexp_uint_t max_size)} +@p{ +Similar to sexp_make_context, but also associates a stack, environment, and +additional globals necessary to evaluate code. Either or both of @var{stack} +and @var{env} may be NULL, in which case defaults will be generated. The +default environment includes the compiled-in C primitives, as well as the 10 +core forms: @scheme{define}, @scheme{set!}, @scheme{lambda}, @scheme{if}, +@scheme{begin}, @scheme{quote}, @scheme{syntax-quote}, @scheme{define-syntax}, +@scheme{let-syntax}, and @scheme{letrec-syntax}. +}} + +@item{@ccode{sexp_load_standard_env(sexp ctx, sexp env, sexp version)} +@p{ +Loads the standard parameters for @var{env}, constructs the feature list from +pre-compiled defaults, and loads the installed initialization file for +@var{version}, which should be the value @var{SEXP_SEVEN}. +Also creates an @scheme{interaction-environment} parameter +and sets @var{env} itself to that. +}} + +@item{@ccode{sexp_load_standard_ports(sexp ctx, sexp env, FILE* in, FILE* out, FILE* err, int leave_open)} +@p{ +Creates @scheme{current-input-port}, @scheme{current-output-port}, and +@scheme{current-error-port} parameters from @var{in}, @var{out} and +@var{err}, and binds them in @var{env}. If @var{env} is @cvar{NULL} +the default context environment is used. Any of the @ctype{FILE*} may +be @cvar{NULL}, in which case the corresponding port is not set. If +@var{leave_open} is true, then the underlying @ctype{FILE*} is left +open after the Scheme port is closed, otherwise they are both closed +together. +}} + +@item{@ccode{sexp_load(sexp ctx, sexp file, sexp env)} +@p{ +Searches the installation path for the @var{file} and loads it in the +environment @var{env}. @var{file} may be a dynamic library or source code. +}} + +@item{@ccode{sexp_eval(sexp ctx, sexp obj, sexp env)} +@p{ +Evaluates @var{obj} as a source form in the environment @var{env} and +returns the result. +}} + +@item{@ccode{sexp_eval_string(sexp ctx, const char* str, int len, sexp env)} +@p{ +Reads a s-expression from the C string @var{str} (or the first @var{len} bytes +if @var{len} is non-negative), evaluates the resulting form in the environment +@var{env}, and returns the result. +}} + +@item{@ccode{sexp_apply(sexp ctx, sexp proc, sexp args)} +@p{ +Applies the procedure @var{proc} to the arguments in the list @var{args} and +returns the result. +}} + +@item{@ccode{sexp_context_env(sexp ctx)} +@p{ +Returns the current default environment associated with the context @var{ctx}. +}} + +@item{@ccode{sexp_env_define(sexp ctx, sexp env, sexp sym, sexp val)} +@p{ +Adds a new binding for @var{sym} in @var{env} with value @var{val}. +}} + +@item{@ccode{sexp_env_ref(sexp env, sexp sym, sexp dflt)} +@p{ +Returns the current binding of @var{sym} in @var{env}, or @var{dflt} if there +is no binding. +}} + +@item{@ccode{sexp_parameter_ref(sexp ctx, sexp param)} +@p{ +Returns the current dynamic value of the parameter @var{param} in the +given context. +}} + +] + +@subsection{Garbage Collection} + +Chibi uses a precise garbage collector by default, which means when performing +multiple computations on the C side you must explicitly preserve any temporary +values. You can declare variables to be preserved with sexp_gc_var@italic{n}, +for n from 1 to 6.@margin-note{You can declare additional macros for larger +values of n if needed.} + +@ccode{ +sexp_gc_var@italic{n}(obj@subscript{1}, obj@subscript{2}, ..., obj@subscript{n}) +} + +This is equivalent to the declaration + +@ccode{ +sexp obj@subscript{1}, obj@subscript{2}, ..., obj@subscript{n}; +} + +except it makes preservation possible. Because it is a declaration it must +occur at the beginning of your function, and because it includes assignments +(in the macro-expanded form) it should occur after all other declarations. + +To preserve these variables for a given context, you can then use +sexp_gc_preserve@italic{n}: + +@ccode{ +sexp_gc_preserve@italic{n}(ctx, obj@subscript{1}, obj@subscript{2}, ..., obj@subscript{n}) +} + +This can be delayed in your code until you know a potentially memory-allocating +computation will be performed, but once you call sexp_gc_preserve@italic{n} it +@emph{must} be paired with a matching sexp_gc_release@italic{n}: + +@ccode{ +sexp_gc_release@italic{n}(ctx); +} + +Note each of these have different signatures. sexp_gc_var@italic{n} just lists +the variables to be declared. sexp_gc_preserve@italic{n} prefixes these with +the context in which they are to be preserved, and sexp_gc_release@italic{n} +just needs the context. + +A typical usage for these is: + +@ccodeblock{ +sexp foo(sexp ctx, sexp bar, sexp baz) { + /* variable declarations */ + int i, j; + ... + sexp_gc_var3(tmp1, tmp2, res); + + /* asserts or other shortcut returns */ + sexp_assert_type(ctx, sexp_barp, SEXP_BAR, bar); + sexp_assert_type(ctx, sexp_bazp, SEXP_BAZ, baz); + + /* preserve the variables in ctx */ + sexp_gc_preserve3(ctx, tmp1, tmp2, res); + + /* perform your computations */ + tmp1 = ... + tmp2 = ... + res = ... + + /* release before returning */ + sexp_gc_release3(ctx); + + return res; +} +} + +If compiled with the Boehm GC, sexp_gc_var@italic{n} just translates to the +plain declaration, while sexp_gc_preserve@italic{n} and +sexp_gc_release@italic{n} become noops. + +When interacting with a garbage collection system from another +language, or communicating between different Chibi managed heaps, you +may want to manually ensure objects are preserved irrespective of any +references to it from other objects in the same heap. This can be +done with the @ccode{sexp_preserve_object} and +@ccode{sexp_release_object} utilities. + +@ccode{ +sexp_preserve_object(ctx, obj) +} + +Increment the absolute reference count for @var{obj}. So long as the +reference count is above 0, @var{obj} will not be reclaimed even if +there are no references to it from other object in the Chibi managed +heap. + +@ccode{ +sexp_release_object(ctx, obj) +} + +Decrement the absolute reference count for @var{obj}. + +@subsection{API Index} + +@subsubsection{Type Predicates} + +The sexp represents different Scheme types with the use of tag bits for +so-called "immediate" values, and a type tag for heap-allocated values. The +following predicates can be used to distinguish these types. Note the +predicates in C all end in "p". For efficiency they are implemented as macros, +and so may evaluate their arguments multiple times. + +@itemlist[ +@item{@ccode{sexp_booleanp(obj)} - @var{obj} is @scheme{#t} or @scheme{#f}} +@item{@ccode{sexp_fixnump(obj)} - @var{obj} is an immediate integer} +@item{@ccode{sexp_flonump(obj)} - @var{obj} is an inexact real} +@item{@ccode{sexp_bignump(obj)} - @var{obj} is a heap-allocated integer} +@item{@ccode{sexp_integerp(obj)} - @var{obj} is an integer} +@item{@ccode{sexp_numberp(obj)} - @var{obj} is any kind of number} +@item{@ccode{sexp_charp(obj)} - @var{obj} is a character} +@item{@ccode{sexp_stringp(obj)} - @var{obj} is a string} +@item{@ccode{sexp_symbolp(obj)} - @var{obj} is a symbol} +@item{@ccode{sexp_idp(obj)} - @var{obj} is a symbol or hygienic identifier} +@item{@ccode{sexp_nullp(obj)} - @var{obj} is the null value} +@item{@ccode{sexp_pairp(obj)} - @var{obj} is a pair} +@item{@ccode{sexp_vectorp(obj)} - @var{obj} is a vector} +@item{@ccode{sexp_iportp(obj)} - @var{obj} is an input port} +@item{@ccode{sexp_oportp(obj)} - @var{obj} is an output port} +@item{@ccode{sexp_portp(obj)} - @var{obj} is any kind of port} +@item{@ccode{sexp_procedurep(obj)} - @var{obj} is a procedure} +@item{@ccode{sexp_opcodep(obj)} - @var{obj} is a primitive opcode} +@item{@ccode{sexp_applicablep(obj)} - @var{obj} is valid as the first arg to apply} +@item{@ccode{sexp_typep(obj)} - @var{obj} is a type} +@item{@ccode{sexp_exceptionp(obj)} - @var{obj} is an exception} +@item{@ccode{sexp_contextp(obj)} - @var{obj} is a context} +@item{@ccode{sexp_envp(obj)} - @var{obj} is an environment} +@item{@ccode{sexp_corep(obj)} - @var{obj} is a special form} +@item{@ccode{sexp_macrop(obj)} - @var{obj} is a macro} +@item{@ccode{sexp_synclop(obj)} - @var{obj} is a syntactic closure} +@item{@ccode{sexp_bytecodep(obj)} - @var{obj} is compiled bytecode} +@item{@ccode{sexp_cpointerp(obj)} - @var{obj} is an opaque C pointer} +] + +@subsubsection{Constants} + +The following shortcuts for various immediate values are available. + +@itemlist[ +@item{@ccode{SEXP_FALSE} - the false boolean} +@item{@ccode{SEXP_TRUE} - the true boolean} +@item{@ccode{SEXP_NULL} - the empty list} +@item{@ccode{SEXP_EOF} - the end-of-file object} +@item{@ccode{SEXP_VOID} - an undefined value often returned by mutators} +@item{@ccode{SEXP_ZERO} - shortcut for sexp_make_fixnum(0)} +@item{...} +@item{@ccode{SEXP_TEN} - shortcut for sexp_make_fixnum(10)} +@item{@ccode{SEXP_NEG_ONE} - shortcut for sexp_make_fixnum(-1)} +] + +@subsubsection{Accessors} + +The following macros provide access to the different components of the +Scheme types. They do no type checking, essentially translating +directly to pointer offsets, so you should be sure to use the above +predicates to check types first. They only evaluate their arguments +once. + +@itemlist[ +@item{@ccode{sexp_make_boolean(n)} - @scheme{#f} if @var{n} is 0, @scheme{#t} otherwise} +@item{@ccode{sexp_unbox_boolean(obj)} - 1 if @var{obj} is @scheme{#t}, 0 otherwise} +@item{@ccode{sexp_make_fixnum(n)} - creates a new fixnum representing int @var{n}} +@item{@ccode{sexp_unbox_fixnum(obj)} - converts a fixnum to a C integer} +@item{@ccode{sexp_make_character(ch)} - creates a new character representing char @var{ch}} +@item{@ccode{sexp_unbox_character(obj)} - converts a character to a C char} +@item{@ccode{sexp_car(pair)} - the car of @var{pair}} +@item{@ccode{sexp_cdr(pair)} - the cdr of @var{pair}} +@item{@ccode{sexp_ratio_numerator(q)} - the numerator of the ratio @var{q}} +@item{@ccode{sexp_ratio_denominator(q)} - the denominator of the ratio @var{q}} +@item{@ccode{sexp_complex_real(z)} - the real part of the complex @var{z}} +@item{@ccode{sexp_complex_imag(z)} - the imaginary part of the complex @var{z}} +@item{@ccode{sexp_string_length(str)} - the byte length of @var{str} as an int} +@item{@ccode{sexp_string_ref(str, i)} - the @var{i}'th byte of string @var{str}} +@item{@ccode{sexp_string_set(str, i, ch)} - set the @var{i}'th byte of string @var{str}} +@item{@ccode{sexp_vector_length(vec)} - the length of @var{vec} as an int} +@item{@ccode{sexp_vector_ref(vec, i)} - the @var{i}'th object of vector @var{vec}} +@item{@ccode{sexp_vector_set(vec, i, obj)} - set the @var{i}'th object of vector @var{vec}} +@item{@ccode{sexp_bytes_length(bv)} - the number of bytes in bytevector @var{bv}} +@item{@ccode{sexp_bytes_ref(bv, i)} - the @var{i}'th byte of bytevector @var{bv}} +@item{@ccode{sexp_bytes_set(bv, i, k)} - set the @var{i}'th byte of bytevector @var{bv}} +] + +@subsubsection{Constructors} + +Constructors allocate memory and so must be passed a context argument. +Any of these may fail and return the OOM exception object. + +@itemlist[ +@item{@ccode{sexp_cons(sexp ctx, sexp obj1, sexp obj2)} - create a new pair whose car is @var{obj1} and whose cdr is @var{obj2}} +@item{@ccode{sexp_list1(sexp ctx, sexp obj)} - alias for sexp_cons(ctx, obj, SEXP_NULL)} +@item{@ccode{sexp_list2(sexp ctx, sexp obj1, sexp obj2)} - create a list of two elements} +@item{@ccode{sexp_make_string(sexp ctx, sexp len, sexp ch)} - create a new Scheme string of @var{len} characters, all initialized to @var{ch}} +@item{@ccode{sexp_c_string(sexp ctx, const char* str, int len)} - create a new Scheme string copying the first @var{len} characters of the C string @var{str}. If @var{len} is -1, uses strlen(@var{str}).} +@item{@ccode{sexp_intern(sexp ctx, const char* str, int len)} - interns a symbol from the first @var{len} characters of the C string @var{str}. If @var{len} is -1, uses strlen(@var{str}).} +@item{@ccode{sexp_make_vector(sexp ctx, sexp len, sexp obj)} - create a new vector of @var{len} elements, all initialized to @var{obj}} +@item{@ccode{sexp_make_integer(sexp ctx, sexp_sint_t n)} - create an integer, heap allocating as a bignum if needed} +@item{@ccode{sexp_make_unsigned_integer(sexp ctx, sexp_uint_t n)} - create an unsigned integer, heap allocating as a bignum if needed} +] + +@subsubsection{I/O} + +@itemlist[ +@item{@ccode{sexp_read(sexp ctx, sexp in)} - read a single datum from port @var{in}} +@item{@ccode{sexp_write(sexp ctx, sexp obj, sexp out)} - write @var{obj} to port @var{out}} +@item{@ccode{sexp_write_string(sexp ctx, char* str, sexp out)} - write the characters in @var{str} to port @var{out}} +@item{@ccode{sexp_display(sexp ctx, sexp obj, sexp out)} - display @var{obj} to port @var{out}} +@item{@ccode{sexp_newline(sexp ctx, sexp out)} - write a newline to port @var{out}} +@item{@ccode{sexp_print_exception(sexp ctx, sexp exn, sexp out)} - print an error message for @var{exn} to port @var{out}} +@item{@ccode{sexp_current_input_port(sexp ctx)} - the @scheme{current-input-port}} +@item{@ccode{sexp_current_output_port(sexp ctx)} - the @scheme{current-output-port}} +@item{@ccode{sexp_current_error_port(sexp ctx)} - the @scheme{current-error-port}} +@item{@ccode{sexp_debug(sexp ctx, char* msg, sexp obj)} - write @var{obj} with a debug message prefix to @scheme{current-error-port}} +@item{@ccode{sexp_read_from_string(sexp ctx, char* str, int len)} - read a single datum from @var{str}, using at most @var{len} bytes if @var{len} is non-negative} +@item{@ccode{sexp_write_to_string(sexp ctx, sexp obj)} - return a Scheme string representation of @var{obj}} +] + +@subsubsection{Utilities} + +@itemlist[ +@item{@ccode{sexp_equalp(sexp ctx, sexp x, sexp y)} - @scheme{equal?}} +@item{@ccode{sexp_length(sexp ctx, sexp ls)} - @scheme{length}} +@item{@ccode{sexp_listp(sexp ctx, sexp x)} - @scheme{list?}} +@item{@ccode{sexp_memq(sexp ctx, sexp x, sexp ls)} - @scheme{memq}} +@item{@ccode{sexp_assq(sexp ctx, sexp x, sexp ls)} - @scheme{assq}} +@item{@ccode{sexp_reverse(sexp ctx, sexp ls)} - @scheme{reverse}} +@item{@ccode{sexp_nreverse(sexp ctx, sexp ls)} - @scheme{reverse!}} +@item{@ccode{sexp_append2(sexp ctx, sexp ls)} - @scheme{append} for two arguments} +@item{@ccode{sexp_copy_list(sexp ctx, sexp ls)} - return a shallow copy of @var{ls}} +@item{@ccode{sexp_list_to_vector(sexp ctx, sexp ls)} - @scheme{list->vector}} +@item{@ccode{sexp_symbol_to_string(sexp ctx, sexp sym)} - @scheme{symbol->string}} +@item{@ccode{sexp_string_to_symbol(sexp ctx, sexp str)} - @scheme{string->symbol}} +@item{@ccode{sexp_string_to_number(sexp ctx, sexp str)} - @scheme{string->number}} +] + +@subsection{Customizing} + +You can add your own types and primitives with the following functions. + +@itemlist[ + +@item{@ccode{sexp sexp_define_foreign(sexp ctx, sexp env, const char* name, int num_args, sexp_proc1 func)} +@p{ +Defines a new primitive procedure with the name @var{name} in the +environment @var{env}. The procedure takes @var{num_args} arguments +and passes them to the C function @var{func}. The C function must +take the standard calling convention: + +@ccode{sexp func(sexp ctx, sexp self, sexp n, sexp arg@sub{1}, ..., sexp arg@sub{num_args})} + +where @var{ctx} is the current context, @var{self} is the procedure +itself, and @var{n} is the number of arguments passed. + +@var{func} is responsible for checking its own argument types. +}} + +@item{@ccode{sexp sexp_define_foreign_opt(sexp ctx, sexp env, const char* name, int num_args, sexp_proc1 func, sexp dflt)} +@p{ +Equivalent to @cfun{sexp_define_foreign}, except the final argument is +optional and defaults to the value @var{dflt}. +}} + +@item{@ccode{sexp sexp_define_foreign_param(sexp ctx, sexp env, const char* name, int num_args, sexp_proc1 func, const char* param)} +@p{ +Equivalent to @cfun{sexp_define_foreign_opt}, except instead of a fixed +default argument @var{param} should be the name of a parameter bound in +@var{env}. +}} + +@item{@ccode{sexp sexp_register_simple_type(sexp ctx, sexp name, sexp parent, sexp slots)} +@p{ +Defines a new simple record type having @var{slots} new slots in addition +to any inherited from the parent type @var{parent}. If @var{parent} is false, +inherits from the default @var{object} record type. +}} + +] + +See the C FFI for an easy way to automate adding bindings for C +functions. + +@section{C FFI} + +The "chibi-ffi" script reads in the C function FFI definitions from an +input file and outputs the appropriate C wrappers into a file with the +same base name and the ".c" extension. You can then compile that C +file into a shared library: + +@command{ +chibi-ffi file.stub +cc -fPIC -shared file.c -lchibi-scheme +} + +(or using whatever flags are appropriate to generate shared libs on +your platform) and the generated .so file can be loaded directly with +@scheme{load}, or portably using @scheme{(include-shared "file")} in a +module definition (note that include-shared uses no suffix). + +The goal of this interface is to make access to C types and functions +easy, without requiring the user to write any C code. That means the +stubber needs to be intelligent about various C calling conventions +and idioms, such as return values passed in actual parameters. +Writing C by hand is still possible, and several of the core modules +provide C interfaces directly without using the stubber. + +@subsection{Includes and Initializations} + +@itemlist[ +@item{@scheme{(c-include header)} - includes the file @var{header}} +@item{@scheme{(c-system-include header)} - includes the system file @var{header}} +@item{@scheme{(c-declare args ...)} - outputs @var{args} directly in the top-level C source} +@item{@scheme{(c-init args ...)} - evaluates @var{args} as C code after all other library initializations have been performed, with @cvar{ctx} and @cvar{env} in scope} +] + +@subsection{Struct Interface} + +C structs can be bound as Scheme types with the +@scheme{define-c-struct} form: + +@schemeblock{ +(define-c-struct struct_name + [predicate: predicate-name] + [constructor: constructor-name] + [finalizer: c_finalizer_name] + (type c_field_name getter-name setter-name) ...) +} + +@var{struct_name} should be the name of a C struct type. If provided, +@var{predicate-name} is bound to a procedure which takes one object +and returns @scheme{#t} iff the object is of type @var{struct_name}. + +If provided, @var{constructor-name} is bound to a procedure of zero +arguments which creates and returns a newly allocated instance of the +type. + +If a finalizer is provided, @var{c_finalizer_name} must be a C +function which takes one argument, a pointer to the struct, and +performs any cleanup or freeing of resources necessary. + +The remaining slots are similar to the +@hyperlink["http://srfi.schemers.org/srfi-9/srfi-9.html"]{SRFI-9} syntax, +except they are prefixed with a C type (described below). The +@var{c_field_name} should be a field name of @var{struct_name}. +@var{getter-name} will then be bound to a procedure of one argument, a +@{struct_name} type, which returns the given field. If provided, +@var{setter-name} will be bound to a procedure of two arguments to +mutate the given field. + +The variants @scheme{define-c-class} and @scheme{define-c-union} take +the same syntax but define types with the @ccode{class} and +@ccode{union} keywords respectively. @scheme{define-c-type} just +defines accessors to an opaque type without any specific struct-like +keyword. + +@schemeblock{ +;; Example: the struct addrinfo returned by getaddrinfo. + +(c-system-include "netdb.h") + +(define-c-struct addrinfo + finalizer: freeaddrinfo + predicate: address-info? + (int ai_family address-info-family) + (int ai_socktype address-info-socket-type) + (int ai_protocol address-info-protocol) + ((link sockaddr) ai_addr address-info-address) + (size_t ai_addrlen address-info-address-length) + ((link addrinfo) ai_next address-info-next)) +} + +@subsection{Function and Constant Interface} + +C functions are defined with: + +@scheme{(define-c return-type name-spec (arg-type ...))} + +where @var{name-space} is either a symbol name, or a list of +@scheme{(scheme-name c_name)}. If just a symbol is used, the C name +is generated automatically by replacing any dashes (-) in the Scheme +name with underscores (_). + +Each @var{arg-type} is a type suitable for input validation and +conversion as discussed below. + +@schemeblock{ +;; Example: define connect(2) in Scheme +(define-c int connect (int sockaddr int)) +} + +Constants can be defined with: + +@scheme{(define-c-const type name-space)} + +where @var{name-space} is the same form as in @scheme{define-c}. This +defines a Scheme variable with the same value as the C constant. + +@schemeblock{ +;; Example: define address family constants in Scheme +(define-c-const int (address-family/unix "AF_UNIX")) +(define-c-const int (address-family/inet "AF_INET")) +} + +@subsection{C Types} + +@subsubsection{Basic Types} + +@itemlist[ +@item{@rawcode{void}} +@item{@rawcode{boolean}} +@item{@rawcode{char}} +@item{@rawcode{sexp} (no conversions)} +] + +@subsubsection{Integer Types} + +@itemlist[ +@item{@rawcode{signed-char}} +@item{@rawcode{short}} +@item{@rawcode{int}} +@item{@rawcode{long}} +@item{@rawcode{unsigned-char}} +@item{@rawcode{unsigned-short}} +@item{@rawcode{unsigned-int}} +@item{@rawcode{unsigned-long}} +@item{@rawcode{size_t}} +@item{@rawcode{pid_t}} +@item{@rawcode{uid_t}} +@item{@rawcode{gid_t}} +@item{@rawcode{time_t} (in seconds, but using the chibi epoch of 2010/01/01)} +@item{@rawcode{errno} (as a return type returns @scheme{#f} on error)} +] + +@subsubsection{Float Types} + +@itemlist[ +@item{@rawcode{float}} +@item{@rawcode{double}} +@item{@rawcode{long-double}} +] + +@subsubsection{String Types} + +@itemlist[ +@item{@rawcode{string} - a null-terminated char*} +@item{@rawcode{env-string} - a @rawcode{VAR=VALUE} string represented as a @scheme{(VAR . VALUE)} pair in Scheme} +@item{@scheme{(array char)} is equivalent to @rawcode{string}} +] + +@subsubsection{Port Types} + +@itemlist[ +@item{@rawcode{input-port}} +@item{@rawcode{output-port}} +] + +@subsubsection{Struct Types} + +Struct types are by default just referred to by the bare +@var{struct_name} from @scheme{define-c-struct}, and it is assumed you +want a pointer to that type. To refer to the full struct, use the +struct modifier, as in @scheme{(struct struct-name)}. + +@subsubsection{Type modifiers} + +Any type may also be written as a list of modifiers followed by the +type itself. The supported modifiers are: + +@itemlist[ + +@item{@rawcode{const} +@p{Prepends the "const" C type modifier. +As a return or result parameter, makes non-immediates immutable.}} + +@item{@rawcode{free} +@p{It's Scheme's responsibility to "free" this resource. +As a return or result parameter, registers the freep flag +this causes the type finalizer to be run when GCed.}} + +@item{@rawcode{maybe-null} +@p{This pointer type may be NULL. +As a result parameter, NULL is translated to #f +normally this would just return a wrapped NULL pointer. +As an input parameter, #f is translated to NULL +normally this would be a type error.}} + +@item{@rawcode{pointer} +@p{Create a pointer to this type. +As a return parameter, wraps the result in a vanilla cpointer. +As a result parameter, boxes then unboxes the value.}} + +@item{@rawcode{reference} +@p{A stack-allocated pointer to this type. +As a result parameter, passes a stack-allocated pointer to +the value, then returns the dereferenced pointer.}} + +@item{@rawcode{struct} +@p{Treat this struct type as a struct, not a pointer. +As an input parameter, dereferences the pointer. +As a type field, indicates a nested struct.}} + +@item{@rawcode{link} +@p{Add a gc link. +As a field getter, link to the parent object, so the +parent won't be GCed so long as we have a reference +to the child. This behavior is automatic for nested structs.}} + +@item{@rawcode{result} +@p{Return a result in this parameter. +If there are multiple results (including the return type), +they are all returned in a list. +If there are any result parameters, a return type +of errno returns #f on failure, and as eliminated +from the list of results otherwise.}} + +@item{@scheme{(value )} +@p{Specify a fixed value. +As an input parameter, this parameter is not provided +in the Scheme API but always passed as .}} + +@item{@scheme{(default )} +@p{Specify a default value. +As the final input parameter, makes the Scheme parameter +optional, defaulting to .}} + +@item{@scheme{(array [])} +@p{An array type. +Length must be specified for return and result parameters. +If specified, length can be either an integer, indicating a fixed size, +or the symbol null, indicating a NULL-terminated array.}} + +] + +@section{Standard Modules} + +A number of SRFIs are provided in the default installation. Note that +SRFIs 0, 6, 22, 23, 46 and 62 are built into the default environment so +there's no need to import them. This list includes popular SRFIs or +SRFIs used in standard Chibi modules + +@itemlist[ + +@item{@hyperlink["http://srfi.schemers.org/srfi-0/srfi-0.html"]{(srfi 0) - cond-expand}} +@item{@hyperlink["http://srfi.schemers.org/srfi-1/srfi-1.html"]{(srfi 1) - list library}} +@item{@hyperlink["http://srfi.schemers.org/srfi-2/srfi-2.html"]{(srfi 2) - and-let*}} +@item{@hyperlink["http://srfi.schemers.org/srfi-6/srfi-6.html"]{(srfi 6) - basic string ports}} +@item{@hyperlink["http://srfi.schemers.org/srfi-8/srfi-8.html"]{(srfi 8) - receive}} +@item{@hyperlink["http://srfi.schemers.org/srfi-9/srfi-9.html"]{(srfi 9) - define-record-type}} +@item{@hyperlink["http://srfi.schemers.org/srfi-11/srfi-11.html"]{(srfi 11) - let-values/let*-values}} +@item{@hyperlink["http://srfi.schemers.org/srfi-16/srfi-16.html"]{(srfi 16) - case-lambda}} +@item{@hyperlink["http://srfi.schemers.org/srfi-18/srfi-18.html"]{(srfi 18) - multi-threading support}} +@item{@hyperlink["http://srfi.schemers.org/srfi-22/srfi-22.html"]{(srfi 22) - running scheme scripts on Unix}} +@item{@hyperlink["http://srfi.schemers.org/srfi-23/srfi-23.html"]{(srfi 23) - error reporting mechanism}} +@item{@hyperlink["http://srfi.schemers.org/srfi-26/srfi-26.html"]{(srfi 26) - cut/cute partial application}} +@item{@hyperlink["http://srfi.schemers.org/srfi-27/srfi-27.html"]{(srfi 27) - sources of random bits}} +@item{@hyperlink["http://srfi.schemers.org/srfi-33/srfi-33.html"]{(srfi 33) - bitwise operators}} +@item{@hyperlink["http://srfi.schemers.org/srfi-38/srfi-38.html"]{(srfi 38) - read/write shared structures}} +@item{@hyperlink["http://srfi.schemers.org/srfi-39/srfi-39.html"]{(srfi 39) - parameter objects}} +@item{@hyperlink["http://srfi.schemers.org/srfi-46/srfi-46.html"]{(srfi 46) - basic syntax-rules extensions}} +@item{@hyperlink["http://srfi.schemers.org/srfi-55/srfi-55.html"]{(srfi 55) - require-extension}} +@item{@hyperlink["http://srfi.schemers.org/srfi-62/srfi-62.html"]{(srfi 62) - s-expression comments}} +@item{@hyperlink["http://srfi.schemers.org/srfi-69/srfi-69.html"]{(srfi 69) - basic hash tables}} +@item{@hyperlink["http://srfi.schemers.org/srfi-95/srfi-95.html"]{(srfi 95) - sorting and merging}} +@item{@hyperlink["http://srfi.schemers.org/srfi-98/srfi-98.html"]{(srfi 98) - environment access}} +@item{@hyperlink["http://srfi.schemers.org/srfi-99/srfi-99.html"]{(srfi 99) - ERR5RS records}} + +] + +Additional non-standard modules are put in the @scheme{(chibi)} module +namespace. + +@itemlist[ + +@item{@hyperlink["lib/chibi/ast.html"]{(chibi ast) - Abstract Syntax Tree and other internal data types}} + +@item{@hyperlink["lib/chibi/disasm.html"]{(chibi disasm) - Disassembler for the virtual machine}} + +@item{@hyperlink["lib/chibi/equiv.html"]{(chibi equiv) - A version of @scheme{equal?} which is guaranteed to terminate}} + +@item{@hyperlink["lib/chibi/filesystem.html"]{(chibi filesystem) - Interface to the filesystem and file descriptor objects}} + +@item{@hyperlink["lib/chibi/generic.html"]{(chibi generic) - Generic methods for CLOS-style object oriented programming}} + +@item{@hyperlink["lib/chibi/heap-stats.html"]{(chibi heap-stats) - Utilities for gathering statistics on the heap}} + +@item{@hyperlink["lib/chibi/io.html"]{(chibi io) - Various I/O extensions and custom ports}} + +@item{@hyperlink["lib/chibi/loop.html"]{(chibi loop) - Fast and extensible loop syntax}} + +@item{@hyperlink["lib/chibi/match.html"]{(chibi match) - Intuitive and widely supported pattern matching syntax}} + +@item{@hyperlink["lib/chibi/mime.html"]{(chibi mime) - Parse MIME files into SXML}} + +@item{@hyperlink["lib/chibi/modules.html"]{(chibi modules) - Introspection for the module system itself}} + +@item{@hyperlink["lib/chibi/net.html"]{(chibi net) - Simple networking interface}} + +@item{@hyperlink["lib/chibi/pathname.html"]{(chibi pathname) - Utilities to decompose and manipulate pathnames}} + +@item{@hyperlink["lib/chibi/process.html"]{(chibi process) - Interface to spawn processes and handle signals}} + +@item{@hyperlink["lib/chibi/repl.html"]{(chibi repl) - A full-featured Read/Eval/Print Loop}} + +@item{@hyperlink["lib/chibi/scribble.html"]{(chibi scribble) - A parser for the scribble syntax used to write this manual}} + +@item{@hyperlink["lib/chibi/stty.html"]{(chibi stty) - A high-level interface to ioctl}} + +@item{@hyperlink["lib/chibi/system.html"]{(chibi system) - Access to the host system and current user information}} + +@item{@hyperlink["lib/chibi/test.html"]{(chibi test) - A simple unit testing framework}} + +@item{@hyperlink["lib/chibi/time.html"]{(chibi time) - An interface to the current system time}} + +@item{@hyperlink["lib/chibi/trace.html"]{(chibi trace) - A utility to trace procedure calls}} + +@item{@hyperlink["lib/chibi/type-inference.html"]{(chibi type-inference) - An easy-to-use type inference system}} + +@item{@hyperlink["lib/chibi/uri.html"]{(chibi uri) - Utilities to parse and construct URIs}} + +@item{@hyperlink["lib/chibi/weak.html"]{(chibi weak) - Data structures with weak references}} + +] diff --git a/doc/lib/chibi/README b/doc/lib/chibi/README new file mode 100644 index 00000000..b6e02ce1 --- /dev/null +++ b/doc/lib/chibi/README @@ -0,0 +1 @@ +Auto-generated module documentation with tools/chibi-doc. diff --git a/eval.c b/eval.c new file mode 100644 index 00000000..e6b6ea10 --- /dev/null +++ b/eval.c @@ -0,0 +1,2193 @@ +/* eval.c -- evaluator library implementation */ +/* Copyright (c) 2009-2012 Alex Shinn. All rights reserved. */ +/* BSD-style license: http://synthcode.com/license.txt */ + +#include "chibi/eval.h" + +/************************************************************************/ + +static int scheme_initialized_p = 0; + +static sexp analyze (sexp ctx, sexp x); +static void generate (sexp ctx, sexp name, sexp loc, sexp lam, sexp x); + +#if SEXP_USE_MODULES +sexp sexp_load_module_file_op (sexp ctx, sexp self, sexp_sint_t n, sexp file, sexp env); +sexp sexp_find_module_file_op (sexp ctx, sexp self, sexp_sint_t n, sexp file); +sexp sexp_current_environment (sexp ctx, sexp self, sexp_sint_t n); +#endif + +sexp sexp_compile_error (sexp ctx, const char *message, sexp o) { + sexp exn; + sexp_gc_var3(sym, irritants, msg); + sexp_gc_preserve3(ctx, sym, irritants, msg); + irritants = sexp_list1(ctx, o); + msg = sexp_c_string(ctx, message, -1); + exn = sexp_make_exception(ctx, sym = sexp_intern(ctx, "compile", -1), + msg, irritants, SEXP_FALSE, + (sexp_pairp(o)?sexp_pair_source(o):SEXP_FALSE)); + sexp_gc_release3(ctx); + return exn; +} + +static void sexp_warn (sexp ctx, char *msg, sexp x) { + sexp out = sexp_current_error_port(ctx); + if (sexp_oportp(out)) { + sexp_write_string(ctx, "WARNING: ", out); + sexp_write_string(ctx, msg, out); + sexp_write(ctx, x, out); + sexp_write_char(ctx, '\n', out); + } +} + +sexp sexp_warn_undefs_op (sexp ctx, sexp self, sexp_sint_t n, sexp from, sexp to, sexp res) { + sexp x, ignore = sexp_exceptionp(res) ? sexp_exception_irritants(res) : SEXP_NULL; + if (sexp_envp(from)) from = sexp_env_bindings(from); + for (x=from; sexp_pairp(x) && x!=to; x=sexp_env_next_cell(x)) + if (sexp_cdr(x) == SEXP_UNDEF && sexp_car(x) != ignore + && sexp_not(sexp_memq(ctx, sexp_car(x), ignore))) + sexp_warn(ctx, "reference to undefined variable: ", sexp_car(x)); + return SEXP_VOID; +} + + +/********************** environment utilities ***************************/ + +static sexp sexp_env_cell_loc (sexp env, sexp key, int localp, sexp *varenv) { + sexp ls; + + do { +#if SEXP_USE_RENAME_BINDINGS + for (ls=sexp_env_renames(env); sexp_pairp(ls); ls=sexp_env_next_cell(ls)) + if (sexp_car(ls) == key) { + if (varenv) *varenv = env; + return sexp_cdr(ls); + } +#endif + for (ls=sexp_env_bindings(env); sexp_pairp(ls); ls=sexp_env_next_cell(ls)) + if (sexp_car(ls) == key) { + if (varenv) *varenv = env; + return ls; + } + env = (localp ? NULL : sexp_env_parent(env)); + } while (env); + + return NULL; +} + +sexp sexp_env_cell (sexp env, sexp key, int localp) { + return sexp_env_cell_loc(env, key, localp, NULL); +} + +static sexp sexp_env_undefine (sexp ctx, sexp env, sexp key) { + sexp ls1=NULL, ls2; + for (ls2=sexp_env_bindings(env); sexp_pairp(ls2); + ls1=ls2, ls2=sexp_env_next_cell(ls2)) + if (sexp_car(ls2) == key) { + if (ls1) sexp_env_next_cell(ls1) = sexp_env_next_cell(ls2); + else sexp_env_bindings(env) = sexp_env_next_cell(ls2); + return SEXP_TRUE; + } + return SEXP_FALSE; +} + +static sexp sexp_env_cell_define (sexp ctx, sexp env, sexp key, + sexp value, sexp *varenv) { + sexp_gc_var2(cell, ls); + while (sexp_env_lambda(env) || sexp_env_syntactic_p(env)) + env = sexp_env_parent(env); + if (varenv) *varenv = env; +#if SEXP_USE_RENAME_BINDINGS + for (ls=sexp_env_renames(env); sexp_pairp(ls); ls=sexp_env_next_cell(ls)) + if (sexp_car(ls) == key) { + sexp_car(ls) = SEXP_FALSE; + break; + } +#endif + for (ls=sexp_env_bindings(env); sexp_pairp(ls); ls=sexp_env_next_cell(ls)) + if (sexp_car(ls) == key) { + if (sexp_cdr(ls) == SEXP_UNDEF) + sexp_cdr(ls) = value; + return ls; + } + sexp_gc_preserve2(ctx, cell, ls); + sexp_env_push(ctx, env, cell, key, value); + sexp_gc_release2(ctx); + return cell; +} + +static sexp sexp_env_cell_create (sexp ctx, sexp env, sexp key, + sexp value, sexp *varenv) { + sexp cell = sexp_env_cell_loc(env, key, 0, varenv); + if (!cell) cell = sexp_env_cell_define(ctx, env, key, value, varenv); + return cell; +} + +sexp sexp_env_ref (sexp env, sexp key, sexp dflt) { + sexp cell = sexp_env_cell(env, key, 0); + return (cell ? sexp_cdr(cell) : dflt); +} + +sexp sexp_env_define (sexp ctx, sexp env, sexp key, sexp value) { + sexp cell, tmp, res = SEXP_VOID; + if (sexp_immutablep(env)) + return sexp_user_exception(ctx, NULL, "immutable binding", key); + cell = sexp_env_cell(env, key, 1); + if (!cell) { + sexp_env_push(ctx, env, tmp, key, value); + } else if (sexp_immutablep(cell)) { + res = sexp_user_exception(ctx, NULL, "immutable binding", key); + } else if (sexp_syntacticp(value) && !sexp_syntacticp(sexp_cdr(cell))) { + sexp_env_undefine(ctx, env, key); + sexp_env_push(ctx, env, tmp, key, value); + } else { + sexp_cdr(cell) = value; + } + return res; +} + +#if SEXP_USE_RENAME_BINDINGS +sexp sexp_env_rename (sexp ctx, sexp env, sexp key, sexp value) { + sexp tmp; + sexp_env_push_rename(ctx, env, tmp, key, value); + return SEXP_VOID; +} +#endif + +sexp sexp_env_exports_op (sexp ctx, sexp self, sexp_sint_t n, sexp env) { + sexp ls; + sexp_gc_var1(res); + sexp_gc_preserve1(ctx, res); + res = SEXP_NULL; +#if SEXP_USE_RENAME_BINDINGS + for (ls=sexp_env_renames(env); sexp_pairp(ls); ls=sexp_env_next_cell(ls)) + sexp_push(ctx, res, sexp_cadr(ls)); +#endif + for (ls=sexp_env_bindings(env); sexp_pairp(ls); ls=sexp_env_next_cell(ls)) + sexp_push(ctx, res, sexp_car(ls)); + sexp_gc_release1(ctx); + return res; +} + +sexp sexp_extend_env (sexp ctx, sexp env, sexp vars, sexp value) { + sexp_gc_var2(e, tmp); + sexp_gc_preserve2(ctx, e, tmp); + e = sexp_alloc_type(ctx, env, SEXP_ENV); + sexp_env_parent(e) = env; + sexp_env_bindings(e) = SEXP_NULL; +#if SEXP_USE_RENAME_BINDINGS + sexp_env_renames(e) = SEXP_NULL; +#endif + for ( ; sexp_pairp(vars); vars = sexp_cdr(vars)) + sexp_env_push(ctx, e, tmp, sexp_car(vars), value); + sexp_gc_release2(ctx); + return e; +} + +sexp sexp_extend_synclo_env (sexp ctx, sexp env) { + sexp e1, e2; + sexp_gc_var1(e); + sexp_gc_preserve1(ctx, e); + e = env; + if (sexp_pairp(sexp_context_fv(ctx))) { + e = sexp_alloc_type(ctx, env, SEXP_ENV); + for (e1=env, e2=NULL; e1; e1=sexp_env_parent(e1)) { + e2 = e2 ? (sexp_env_parent(e2) = sexp_alloc_type(ctx, env, SEXP_ENV)) : e; + sexp_env_bindings(e2) = sexp_env_bindings(e1); + sexp_env_syntactic_p(e2) = 1; +#if SEXP_USE_RENAME_BINDINGS + sexp_env_renames(e2) = sexp_env_renames(e1); +#endif + } + sexp_env_parent(e2) = sexp_context_env(ctx); + } + sexp_gc_release1(ctx); + return e; +} + +static sexp sexp_reverse_flatten_dot (sexp ctx, sexp ls) { + sexp_gc_var1(res); + sexp_gc_preserve1(ctx, res); + for (res=SEXP_NULL; sexp_pairp(ls); ls=sexp_cdr(ls)) + sexp_push(ctx, res, sexp_car(ls)); + if (!sexp_nullp(ls)) + res = sexp_cons(ctx, ls, res); + sexp_gc_release1(ctx); + return res; +} + +static sexp sexp_flatten_dot (sexp ctx, sexp ls) { + return sexp_nreverse(ctx, sexp_reverse_flatten_dot(ctx, ls)); +} + +int sexp_param_index (sexp lambda, sexp name) { + sexp ls = sexp_lambda_params(lambda); + int i = 0; + for (i=0; sexp_pairp(ls); ls=sexp_cdr(ls), i++) + if (sexp_car(ls) == name) + return i; + if (ls == name) + return i; + ls = sexp_lambda_locals(lambda); + for (i=-1; sexp_pairp(ls); ls=sexp_cdr(ls), i--) + if (sexp_car(ls) == name) + return i-4; + return -10000; +} + +/************************* bytecode utilities ***************************/ + +static void shrink_bcode (sexp ctx, sexp_uint_t i) { + sexp tmp; + if (sexp_bytecode_length(sexp_context_bc(ctx)) != i) { + tmp = sexp_alloc_bytecode(ctx, i); + sexp_bytecode_name(tmp) = sexp_bytecode_name(sexp_context_bc(ctx)); + sexp_bytecode_length(tmp) = i; + sexp_bytecode_literals(tmp) + = sexp_bytecode_literals(sexp_context_bc(ctx)); + memcpy(sexp_bytecode_data(tmp), + sexp_bytecode_data(sexp_context_bc(ctx)), + i); + sexp_context_bc(ctx) = tmp; + } +} + +static void expand_bcode (sexp ctx, sexp_uint_t size) { + sexp tmp; + if (sexp_bytecode_length(sexp_context_bc(ctx)) + < (sexp_context_pos(ctx))+size) { + tmp=sexp_alloc_bytecode(ctx, sexp_bytecode_length(sexp_context_bc(ctx))*2); + sexp_bytecode_name(tmp) = sexp_bytecode_name(sexp_context_bc(ctx)); + sexp_bytecode_length(tmp) + = sexp_bytecode_length(sexp_context_bc(ctx))*2; + sexp_bytecode_literals(tmp) + = sexp_bytecode_literals(sexp_context_bc(ctx)); + memcpy(sexp_bytecode_data(tmp), + sexp_bytecode_data(sexp_context_bc(ctx)), + sexp_bytecode_length(sexp_context_bc(ctx))); + sexp_context_bc(ctx) = tmp; + } +} + +static void emit_enter (sexp ctx); +static void emit_return (sexp ctx); +static void bless_bytecode (sexp ctx, sexp bc); + +static sexp finalize_bytecode (sexp ctx) { + sexp bc; + emit_return(ctx); + shrink_bcode(ctx, sexp_context_pos(ctx)); + bc = sexp_context_bc(ctx); + if (sexp_pairp(sexp_bytecode_literals(bc))) { /* compress literals */ + if (sexp_nullp(sexp_cdr(sexp_bytecode_literals(bc)))) + sexp_bytecode_literals(bc) = sexp_car(sexp_bytecode_literals(bc)); + else if (sexp_nullp(sexp_cddr(sexp_bytecode_literals(bc)))) + sexp_cdr(sexp_bytecode_literals(bc)) = sexp_cadr(sexp_bytecode_literals(bc)); + else + sexp_bytecode_literals(bc) = sexp_list_to_vector(ctx, sexp_bytecode_literals(bc)); + } + bless_bytecode(ctx, bc); + return bc; +} + +static void emit (sexp ctx, unsigned char c) { + expand_bcode(ctx, 1); + sexp_bytecode_data(sexp_context_bc(ctx))[sexp_context_pos(ctx)++] = c; +} + +sexp sexp_make_procedure_op (sexp ctx, sexp self, sexp_sint_t n, sexp flags, + sexp num_args, sexp bc, sexp vars) { + sexp proc = sexp_alloc_type(ctx, procedure, SEXP_PROCEDURE); + sexp_procedure_flags(proc) = (char) (sexp_uint_t) flags; + sexp_procedure_num_args(proc) = sexp_unbox_fixnum(num_args); + sexp_procedure_code(proc) = bc; + sexp_procedure_vars(proc) = vars; + return proc; +} + +static sexp sexp_make_macro (sexp ctx, sexp p, sexp e) { + sexp mac = sexp_alloc_type(ctx, macro, SEXP_MACRO); + sexp_macro_env(mac) = e; + sexp_macro_proc(mac) = p; + return mac; +} + +sexp sexp_make_synclo_op (sexp ctx, sexp self, sexp_sint_t n, sexp env, sexp fv, sexp expr) { + sexp res; + if (! (sexp_symbolp(expr) || sexp_pairp(expr))) + return expr; + res = sexp_alloc_type(ctx, synclo, SEXP_SYNCLO); + sexp_synclo_env(res) = env; + sexp_synclo_free_vars(res) = fv; + sexp_synclo_expr(res) = expr; + return res; +} + +/* internal AST */ + +static sexp sexp_make_lambda (sexp ctx, sexp params) { + sexp res = sexp_alloc_type(ctx, lambda, SEXP_LAMBDA); + sexp_lambda_name(res) = SEXP_FALSE; + sexp_lambda_params(res) = params; + sexp_lambda_fv(res) = SEXP_NULL; + sexp_lambda_sv(res) = SEXP_NULL; + sexp_lambda_locals(res) = SEXP_NULL; + sexp_lambda_defs(res) = SEXP_NULL; + sexp_lambda_return_type(res) = SEXP_FALSE; + sexp_lambda_param_types(res) = SEXP_NULL; + return res; +} + +static sexp sexp_make_set (sexp ctx, sexp var, sexp value) { + sexp res = sexp_alloc_type(ctx, set, SEXP_SET); + sexp_set_var(res) = var; + sexp_set_value(res) = value; + return res; +} + +static sexp sexp_make_ref (sexp ctx, sexp name, sexp cell) { + sexp res = sexp_alloc_type(ctx, ref, SEXP_REF); + sexp_ref_name(res) = name; + sexp_ref_cell(res) = cell; + return res; +} + +static sexp sexp_make_cnd (sexp ctx, sexp test, sexp pass, sexp fail) { + sexp res = sexp_alloc_type(ctx, cnd, SEXP_CND); + sexp_cnd_test(res) = test; + sexp_cnd_pass(res) = pass; + sexp_cnd_fail(res) = fail; + return res; +} + +sexp sexp_make_lit (sexp ctx, sexp value) { + sexp res = sexp_alloc_type(ctx, lit, SEXP_LIT); + sexp_lit_value(res) = value; + return res; +} + +/****************************** contexts ******************************/ + +#define SEXP_STACK_SIZE (sexp_sizeof(stack)+sizeof(sexp)*SEXP_INIT_STACK_SIZE) + +static void sexp_add_path (sexp ctx, const char *str) { + const char *colon; + if (str && *str) { + colon = strchr(str, ':'); + if (colon) + sexp_add_path(ctx, colon+1); + else + colon = str + strlen(str); + sexp_push(ctx, sexp_global(ctx, SEXP_G_MODULE_PATH), SEXP_VOID); + sexp_car(sexp_global(ctx, SEXP_G_MODULE_PATH)) + = sexp_c_string(ctx, str, colon-str); + } +} + +#if ! SEXP_USE_NATIVE_X86 +static void sexp_init_eval_context_bytecodes (sexp ctx) { + sexp_gc_var3(tmp, vec, ctx2); + sexp_gc_preserve3(ctx, tmp, vec, ctx2); + emit(ctx, SEXP_OP_RESUMECC); + sexp_global(ctx, SEXP_G_RESUMECC_BYTECODE) = finalize_bytecode(ctx); + ctx2 = sexp_make_child_context(ctx, NULL); + emit(ctx2, SEXP_OP_DONE); + tmp = finalize_bytecode(ctx2); + vec = sexp_make_vector(ctx, 0, SEXP_VOID); + sexp_global(ctx, SEXP_G_FINAL_RESUMER) + = sexp_make_procedure(ctx, SEXP_ZERO, SEXP_ZERO, tmp, vec); + sexp_bytecode_name(sexp_procedure_code(sexp_global(ctx, SEXP_G_FINAL_RESUMER))) + = sexp_intern(ctx, "final-resumer", -1); + sexp_gc_release3(ctx); +} +#endif + +void sexp_init_eval_context_globals (sexp ctx) { + sexp_gc_var1(tmp); + ctx = sexp_make_child_context(ctx, NULL); + sexp_gc_preserve1(ctx, tmp); +#if ! SEXP_USE_NATIVE_X86 + sexp_init_eval_context_bytecodes(ctx); +#endif + sexp_global(ctx, SEXP_G_MODULE_PATH) = SEXP_NULL; + sexp_add_path(ctx, sexp_default_module_path); + sexp_add_path(ctx, getenv(SEXP_MODULE_PATH_VAR)); + tmp = sexp_c_string(ctx, "./lib", 5); + sexp_push(ctx, sexp_global(ctx, SEXP_G_MODULE_PATH), tmp); + tmp = sexp_c_string(ctx, ".", 1); + sexp_push(ctx, sexp_global(ctx, SEXP_G_MODULE_PATH), tmp); +#if SEXP_USE_GREEN_THREADS + sexp_global(ctx, SEXP_G_IO_BLOCK_ERROR) + = sexp_user_exception(ctx, SEXP_FALSE, "I/O would block", SEXP_NULL); + sexp_global(ctx, SEXP_G_THREADS_FRONT) = SEXP_NULL; + sexp_global(ctx, SEXP_G_THREADS_BACK) = SEXP_NULL; + sexp_global(ctx, SEXP_G_THREADS_SIGNALS) = SEXP_ZERO; + sexp_global(ctx, SEXP_G_THREADS_SIGNAL_RUNNER) = SEXP_FALSE; +#endif + sexp_gc_release1(ctx); +} + +sexp sexp_make_eval_context (sexp ctx, sexp stack, sexp env, sexp_uint_t size, sexp_uint_t max_size) { + sexp_gc_var1(res); + res = sexp_make_context(ctx, size, max_size); + if (!res || sexp_exceptionp(res)) + return res; + if (ctx) sexp_gc_preserve1(ctx, res); + sexp_context_env(res) = (env ? env : sexp_make_primitive_env(res, SEXP_SEVEN)); + sexp_context_bc(res) = sexp_alloc_bytecode(res, SEXP_INIT_BCODE_SIZE); + sexp_bytecode_name(sexp_context_bc(res)) = SEXP_FALSE; + sexp_bytecode_length(sexp_context_bc(res)) = SEXP_INIT_BCODE_SIZE; + sexp_bytecode_literals(sexp_context_bc(res)) = SEXP_NULL; + if ((! stack) || (stack == SEXP_FALSE)) { + stack = sexp_alloc_tagged(res, SEXP_STACK_SIZE, SEXP_STACK); + sexp_stack_length(stack) = SEXP_INIT_STACK_SIZE; + sexp_stack_top(stack) = 0; + } + sexp_context_stack(res) = stack; + if (! ctx) sexp_init_eval_context_globals(res); + if (ctx) { + sexp_context_params(res) = sexp_context_params(ctx); + sexp_context_tracep(res) = sexp_context_tracep(ctx); + sexp_context_dk(res) = sexp_context_dk(ctx); + sexp_gc_release1(ctx); + } else { + sexp_context_dk(res) = sexp_list1(res, SEXP_FALSE); + } + return res; +} + +sexp sexp_make_child_context (sexp ctx, sexp lambda) { + sexp res = sexp_make_eval_context(ctx, + sexp_context_stack(ctx), + sexp_context_env(ctx), + 0, + sexp_context_max_size(ctx)); + if (! sexp_exceptionp(res)) { + sexp_context_lambda(res) = lambda; + sexp_context_top(res) = sexp_context_top(ctx); + sexp_context_fv(res) = sexp_context_fv(ctx); + sexp_context_tracep(res) = sexp_context_tracep(ctx); + } + return res; +} + +/**************************** identifiers *****************************/ + +sexp sexp_identifierp_op (sexp ctx, sexp self, sexp_sint_t n, sexp x) { + return sexp_make_boolean(sexp_idp(x)); +} + +sexp sexp_syntactic_closure_expr_op (sexp ctx, sexp self, sexp_sint_t n, sexp x) { + return (sexp_synclop(x) ? sexp_synclo_expr(x) : x); +} + +sexp sexp_strip_synclos (sexp ctx, sexp self, sexp_sint_t n, sexp x) { + sexp_gc_var3(res, kar, kdr); + sexp_gc_preserve3(ctx, res, kar, kdr); + loop: + if (sexp_synclop(x)) { + x = sexp_synclo_expr(x); + goto loop; + } else if (sexp_pairp(x) && sexp_truep(sexp_length(ctx, x))) { + kar = sexp_strip_synclos(ctx, self, n, sexp_car(x)); + kdr = sexp_strip_synclos(ctx, self, n, sexp_cdr(x)); + res = sexp_cons(ctx, kar, kdr); + sexp_pair_source(res) = sexp_pair_source(x); + sexp_immutablep(res) = 1; + } else { + res = x; + } + sexp_gc_release3(ctx); + return res; +} + +sexp sexp_identifier_eq_op (sexp ctx, sexp self, sexp_sint_t n, sexp e1, sexp id1, sexp e2, sexp id2) { + sexp cell1, cell2; + cell1 = sexp_env_cell(e1, id1, 0); + if (!cell1 && sexp_synclop(id1)) { + e1 = sexp_synclo_env(id1); + id1 = sexp_synclo_expr(id1); + cell1 = sexp_env_cell(e1, id1, 0); + } + cell2 = sexp_env_cell(e2, id2, 0); + if (!cell2 && sexp_synclop(id2)) { + e2 = sexp_synclo_env(id2); + id2 = sexp_synclo_expr(id2); + cell2 = sexp_env_cell(e2, id2, 0); + } + if (cell1 && (cell1 == cell2)) + return SEXP_TRUE; + else if (!cell1 && !cell2 && (id1 == id2)) + return SEXP_TRUE; +#if ! SEXP_USE_STRICT_TOPLEVEL_BINDINGS + else if (cell1 && !sexp_lambdap(sexp_cdr(cell1)) + && cell2 && !sexp_lambdap(sexp_cdr(cell2)) + && (id1 == id2)) + return SEXP_TRUE; +#endif + return SEXP_FALSE; +} + +/************************* the compiler ***************************/ + +static sexp analyze_app (sexp ctx, sexp x) { + sexp p; + sexp_gc_var2(res, tmp); + sexp_gc_preserve2(ctx, res, tmp); + for (res=SEXP_NULL; sexp_pairp(x); x=sexp_cdr(x)) { + sexp_push(ctx, res, SEXP_FALSE); + tmp = analyze(ctx, sexp_car(x)); + if (sexp_exceptionp(tmp)) { + res = tmp; + break; + } else { + sexp_car(res) = tmp; + } + } + if (sexp_pairp(res)) { /* fill in lambda names */ + res = sexp_nreverse(ctx, res); + if (sexp_lambdap(sexp_car(res))) { + p=sexp_lambda_params(sexp_car(res)); + for (tmp=sexp_cdr(res); sexp_pairp(tmp)&&sexp_pairp(p); tmp=sexp_cdr(tmp), p=sexp_cdr(p)) + if (sexp_lambdap(sexp_car(tmp))) + sexp_lambda_name(sexp_car(tmp)) = sexp_car(p); + } + } + sexp_gc_release2(ctx); + return res; +} + +static sexp analyze_seq (sexp ctx, sexp ls) { + sexp_gc_var2(res, tmp); + sexp_gc_preserve2(ctx, res, tmp); + if (sexp_nullp(ls)) + res = SEXP_VOID; + else if (sexp_nullp(sexp_cdr(ls))) + res = analyze(ctx, sexp_car(ls)); + else { + res = sexp_alloc_type(ctx, seq, SEXP_SEQ); + tmp = analyze_app(ctx, ls); + if (sexp_exceptionp(tmp)) + res = tmp; + else + sexp_seq_ls(res) = tmp; + } + sexp_gc_release2(ctx); + return res; +} + +static sexp analyze_var_ref (sexp ctx, sexp x, sexp *varenv) { + sexp env = sexp_context_env(ctx), res; + sexp_gc_var1(cell); + sexp_gc_preserve1(ctx, cell); + cell = sexp_env_cell_loc(env, x, 0, varenv); + if (! cell) { + if (sexp_synclop(x)) { + if (sexp_not(sexp_memq(ctx, sexp_synclo_expr(x), sexp_context_fv(ctx))) + && sexp_not(sexp_memq(ctx, sexp_synclo_expr(x), sexp_synclo_free_vars(x)))) + env = sexp_synclo_env(x); + x = sexp_synclo_expr(x); + } + cell = sexp_env_cell_create(ctx, env, x, SEXP_UNDEF, varenv); + } + if (sexp_macrop(sexp_cdr(cell)) || sexp_corep(sexp_cdr(cell))) + res = sexp_compile_error(ctx, "invalid use of syntax as value", x); + else + res = sexp_make_ref(ctx, x, cell); + sexp_gc_release1(ctx); + return res; +} + +static sexp analyze_set (sexp ctx, sexp x) { + sexp res, varenv; + sexp_gc_var2(ref, value); + sexp_gc_preserve2(ctx, ref, value); + if (! (sexp_pairp(sexp_cdr(x)) && sexp_pairp(sexp_cddr(x)) + && sexp_nullp(sexp_cdddr(x)) && sexp_idp(sexp_cadr(x)))) { + res = sexp_compile_error(ctx, "bad set! syntax", x); + } else { + ref = analyze_var_ref(ctx, sexp_cadr(x), &varenv); + if (sexp_lambdap(sexp_ref_loc(ref))) + sexp_insert(ctx, sexp_lambda_sv(sexp_ref_loc(ref)), sexp_ref_name(ref)); + value = analyze(ctx, sexp_caddr(x)); + if (sexp_exceptionp(ref)) + res = ref; + else if (sexp_exceptionp(value)) + res = value; + else if (sexp_immutablep(sexp_ref_cell(ref)) + || (varenv && sexp_immutablep(varenv))) + res = sexp_compile_error(ctx, "immutable binding", sexp_cadr(x)); + else + res = sexp_make_set(ctx, ref, value); + } + sexp_gc_release2(ctx); + return res; +} + +#define sexp_return(res, val) do {res=val; goto cleanup;} while (0) + +static sexp analyze_lambda (sexp ctx, sexp x) { + int trailing_non_procs; + sexp name, ls, ctx3; + sexp_gc_var6(res, body, tmp, value, defs, ctx2); + sexp_gc_preserve6(ctx, res, body, tmp, value, defs, ctx2); + /* verify syntax */ + if (! (sexp_pairp(sexp_cdr(x)) && sexp_pairp(sexp_cddr(x)))) + sexp_return(res, sexp_compile_error(ctx, "bad lambda syntax", x)); + for (ls=sexp_cadr(x); sexp_pairp(ls); ls=sexp_cdr(ls)) + if (! sexp_idp(sexp_car(ls))) + sexp_return(res, sexp_compile_error(ctx, "non-symbol parameter", x)); + else if (sexp_truep(sexp_memq(ctx, sexp_car(ls), sexp_cdr(ls)))) + sexp_return(res, sexp_compile_error(ctx, "duplicate parameter", x)); + /* build lambda and analyze body */ + res = sexp_make_lambda(ctx, tmp=sexp_copy_list(ctx, sexp_cadr(x))); + sexp_lambda_source(res) = sexp_pair_source(x); + if (! (sexp_lambda_source(res) && sexp_pairp(sexp_lambda_source(res)))) + sexp_lambda_source(res) = sexp_pair_source(sexp_cdr(x)); + if (! (sexp_lambda_source(res) && sexp_pairp(sexp_lambda_source(res)))) + sexp_lambda_source(res) = sexp_pair_source(sexp_cddr(x)); + ctx2 = sexp_make_child_context(ctx, res); + tmp = sexp_flatten_dot(ctx2, sexp_lambda_params(res)); + sexp_context_env(ctx2) = sexp_extend_env(ctx2, sexp_context_env(ctx2), tmp, res); + sexp_env_lambda(sexp_context_env(ctx2)) = res; + body = analyze_seq(ctx2, sexp_cddr(x)); + if (sexp_exceptionp(body)) sexp_return(res, body); + /* delayed analyze internal defines */ + trailing_non_procs = 0; + defs = SEXP_NULL; + for (ls=sexp_lambda_defs(res); sexp_pairp(ls); ls=sexp_cdr(ls)) { + tmp = sexp_car(ls); + ctx3 = sexp_cdr(tmp); + if (sexp_pairp(sexp_caar(tmp))) { + name = sexp_caaar(tmp); + tmp = sexp_cons(ctx3, sexp_cdaar(tmp), sexp_cdar(tmp)); + tmp = sexp_cons(ctx3, SEXP_VOID, tmp); + sexp_pair_source(tmp) = sexp_pair_source(sexp_caar(ls)); + value = analyze_lambda(ctx3, tmp); + } else { + name = sexp_caar(tmp); + value = analyze(ctx3, sexp_cadar(tmp)); + } + if (sexp_exceptionp(value)) sexp_return(res, value); + if (sexp_lambdap(value)) sexp_lambda_name(value) = name; + sexp_push(ctx3, defs, + sexp_make_set(ctx3, analyze_var_ref(ctx3, name, NULL), value)); + if (!sexp_lambdap(value)) trailing_non_procs = 1; + if (trailing_non_procs || !SEXP_USE_UNBOXED_LOCALS) + sexp_insert(ctx3, sexp_lambda_sv(res), name); + } + if (sexp_pairp(defs)) { + if (! sexp_seqp(body)) { + tmp = sexp_alloc_type(ctx2, seq, SEXP_SEQ); + sexp_seq_ls(tmp) = sexp_list1(ctx2, body); + body = tmp; + } + sexp_seq_ls(body) = sexp_append2(ctx2, defs, sexp_seq_ls(body)); + } + sexp_lambda_body(res) = body; + cleanup: + sexp_gc_release6(ctx); + return res; +} + +static sexp analyze_if (sexp ctx, sexp x) { + sexp res, fail_expr; + sexp_gc_var3(test, pass, fail); + sexp_gc_preserve3(ctx, test, pass, fail); + if (! (sexp_pairp(sexp_cdr(x)) && sexp_pairp(sexp_cddr(x)))) { + res = sexp_compile_error(ctx, "bad if syntax", x); + } else { + test = analyze(ctx, sexp_cadr(x)); + pass = analyze(ctx, sexp_caddr(x)); + fail_expr = sexp_pairp(sexp_cdddr(x)) ? sexp_cadddr(x) : SEXP_VOID; + fail = analyze(ctx, fail_expr); + res = (sexp_exceptionp(test) ? test : sexp_exceptionp(pass) ? pass : + sexp_exceptionp(fail) ? fail : sexp_make_cnd(ctx, test, pass, fail)); + } + sexp_gc_release3(ctx); + return res; +} + +static sexp analyze_define (sexp ctx, sexp x) { + sexp name, res, varenv; + sexp_gc_var4(ref, value, tmp, env); + sexp_gc_preserve4(ctx, ref, value, tmp, env); + env = sexp_context_env(ctx); + while (sexp_env_syntactic_p(env) && sexp_env_parent(env)) + env = sexp_env_parent(env); + if (! (sexp_pairp(sexp_cdr(x)) && sexp_pairp(sexp_cddr(x)))) { + res = sexp_compile_error(ctx, "bad define syntax", x); + } else { + name = (sexp_pairp(sexp_cadr(x)) ? sexp_caadr(x) : sexp_cadr(x)); + if (! sexp_idp(name)) { + res = sexp_compile_error(ctx, "can't define a non-symbol", x); + } else if (sexp_env_lambda(env) && sexp_lambdap(sexp_env_lambda(env))) { + sexp_env_push(ctx, env, tmp, name, sexp_context_lambda(ctx)); + sexp_push(ctx, sexp_lambda_locals(sexp_env_lambda(env)), name); + tmp = sexp_cons(ctx, sexp_cdr(x), ctx); + sexp_pair_source(sexp_cdr(x)) = sexp_pair_source(x); + sexp_push(ctx, sexp_lambda_defs(sexp_env_lambda(env)), tmp); + res = SEXP_VOID; + } else { + if (sexp_synclop(name)) name = sexp_synclo_expr(name); + sexp_env_cell_define(ctx, env, name, SEXP_VOID, &varenv); + if (sexp_pairp(sexp_cadr(x))) { + tmp = sexp_cons(ctx, sexp_cdadr(x), sexp_cddr(x)); + tmp = sexp_cons(ctx, SEXP_VOID, tmp); + sexp_pair_source(tmp) = sexp_pair_source(x); + value = analyze_lambda(ctx, tmp); + } else + value = analyze(ctx, sexp_caddr(x)); + tmp = sexp_env_cell_loc(env, name, 0, &varenv); + ref = sexp_make_ref(ctx, name, tmp); + if (sexp_exceptionp(ref)) { + res = ref; + } else if (sexp_exceptionp(value)) { + res = value; + } else if (varenv && sexp_immutablep(varenv)) { + res = sexp_compile_error(ctx, "immutable binding", name); + } else { + if (sexp_lambdap(value)) sexp_lambda_name(value) = name; + res = sexp_make_set(ctx, ref, value); + } + } + } + sexp_gc_release4(ctx); + return res; +} + +static sexp analyze_bind_syntax (sexp ls, sexp eval_ctx, sexp bind_ctx) { + sexp res = SEXP_VOID, name; + sexp_gc_var1(mac); + sexp_gc_preserve1(eval_ctx, mac); + for ( ; sexp_pairp(ls); ls=sexp_cdr(ls)) { + if (! (sexp_pairp(sexp_car(ls)) && sexp_pairp(sexp_cdar(ls)) + && sexp_nullp(sexp_cddar(ls)))) { + res = sexp_compile_error(eval_ctx, "bad syntax binding", sexp_car(ls)); + } else { + if (sexp_idp(sexp_cadar(ls))) + mac = sexp_env_ref(sexp_context_env(eval_ctx), sexp_cadar(ls), SEXP_FALSE); + else + mac = sexp_eval(eval_ctx, sexp_cadar(ls), NULL); + if (sexp_procedurep(mac)) { + mac = sexp_make_macro(eval_ctx, mac, sexp_context_env(bind_ctx)); + } else if (!(sexp_macrop(mac)||sexp_corep(mac))) { + res = (sexp_exceptionp(mac) ? mac + : sexp_compile_error(eval_ctx, "non-procedure macro", mac)); + break; + } + name = sexp_caar(ls); + if (sexp_synclop(name) && sexp_env_global_p(sexp_context_env(bind_ctx))) + name = sexp_synclo_expr(name); + if (sexp_macrop(mac) && sexp_pairp(sexp_cadar(ls))) + sexp_macro_source(mac) = sexp_pair_source(sexp_cadar(ls)); + sexp_env_define(eval_ctx, sexp_context_env(bind_ctx), name, mac); + } + } + sexp_gc_release1(eval_ctx); + return res; +} + +static sexp analyze_define_syntax (sexp ctx, sexp x) { + sexp res; + sexp_gc_var1(tmp); + sexp_gc_preserve1(ctx, tmp); + tmp = sexp_list1(ctx, sexp_cdr(x)); + res = analyze_bind_syntax(tmp, ctx, ctx); + sexp_gc_release1(ctx); + return res; +} + +static sexp analyze_let_syntax_aux (sexp ctx, sexp x, int recp) { + sexp res; + sexp_gc_var3(env, ctx2, tmp); + sexp_gc_preserve3(ctx, env, ctx2, tmp); + if (! (sexp_pairp(sexp_cdr(x)) && sexp_pairp(sexp_cddr(x)))) { + res = sexp_compile_error(ctx, "bad let(rec)-syntax", x); + } else { + env = sexp_alloc_type(ctx, env, SEXP_ENV); + sexp_env_syntactic_p(env) = 1; + sexp_env_parent(env) = sexp_context_env(ctx); + sexp_env_bindings(env) = SEXP_NULL; +#if SEXP_USE_RENAME_BINDINGS + sexp_env_renames(env) = SEXP_NULL; +#endif + ctx2 = sexp_make_child_context(ctx, sexp_context_lambda(ctx)); + sexp_context_env(ctx2) = env; + tmp = analyze_bind_syntax(sexp_cadr(x), (recp ? ctx2 : ctx), ctx2); + res = (sexp_exceptionp(tmp) ? tmp : analyze_seq(ctx2, sexp_cddr(x))); + } + sexp_gc_release3(ctx); + return res; +} + +static sexp analyze_let_syntax (sexp ctx, sexp x) { + return analyze_let_syntax_aux(ctx, x, 0); +} + +static sexp analyze_letrec_syntax (sexp ctx, sexp x) { + return analyze_let_syntax_aux(ctx, x, 1); +} + +static sexp analyze (sexp ctx, sexp object) { + sexp op; + sexp_gc_var4(res, tmp, x, cell); + sexp_gc_preserve4(ctx, res, tmp, x, cell); + x = object; + loop: + if (sexp_pairp(x)) { + if (sexp_not(sexp_listp(ctx, x))) { + res = sexp_compile_error(ctx, "dotted list in source", x); + } else if (sexp_idp(sexp_car(x))) { + cell = sexp_env_cell(sexp_context_env(ctx), sexp_car(x), 0); + if (! cell && sexp_synclop(sexp_car(x))) + cell = sexp_env_cell(sexp_synclo_env(sexp_car(x)), + sexp_synclo_expr(sexp_car(x)), + 0); + if (! cell) { + res = analyze_app(ctx, x); + if (sexp_exceptionp(res)) + sexp_warn(ctx, "exception inside undefined operator: ", sexp_car(x)); + } else { + op = sexp_cdr(cell); + if (sexp_corep(op)) { + switch (sexp_core_code(op)) { + case SEXP_CORE_DEFINE: + res = analyze_define(ctx, x); break; + case SEXP_CORE_SET: + res = analyze_set(ctx, x); break; + case SEXP_CORE_LAMBDA: + res = analyze_lambda(ctx, x); break; + case SEXP_CORE_IF: + res = analyze_if(ctx, x); break; + case SEXP_CORE_BEGIN: + res = analyze_seq(ctx, sexp_cdr(x)); break; + case SEXP_CORE_QUOTE: + case SEXP_CORE_SYNTAX_QUOTE: + if (! (sexp_pairp(sexp_cdr(x)) && sexp_nullp(sexp_cddr(x)))) + res = sexp_compile_error(ctx, "bad quote form", x); + else + res = sexp_make_lit(ctx, + (sexp_core_code(op) == SEXP_CORE_QUOTE) ? + tmp=sexp_strip_synclos(ctx , NULL, 1, sexp_cadr(x)) : + sexp_cadr(x)); + break; + case SEXP_CORE_DEFINE_SYNTAX: + res = analyze_define_syntax(ctx, x); break; + case SEXP_CORE_LET_SYNTAX: + res = analyze_let_syntax(ctx, x); break; + case SEXP_CORE_LETREC_SYNTAX: + res = analyze_letrec_syntax(ctx, x); break; + default: + res = sexp_compile_error(ctx, "unknown core form", op); break; + } + } else if (sexp_macrop(op)) { + tmp = sexp_cons(ctx, sexp_macro_env(op), SEXP_NULL); + tmp = sexp_cons(ctx, sexp_context_env(ctx), tmp); + tmp = sexp_cons(ctx, x, tmp); + x = sexp_make_child_context(ctx, sexp_context_lambda(ctx)); + x = sexp_apply(x, sexp_macro_proc(op), tmp); + if (sexp_exceptionp(x) && sexp_not(sexp_exception_source(x))) + sexp_exception_source(x) = sexp_pair_source(sexp_car(tmp)); + goto loop; + } else if (sexp_opcodep(op)) { + res = sexp_length(ctx, sexp_cdr(x)); + if (sexp_unbox_fixnum(res) < sexp_opcode_num_args(op)) { + res = sexp_compile_error(ctx, "not enough args for opcode", x); + } else if ((sexp_unbox_fixnum(res) > sexp_opcode_num_args(op)) + && (! sexp_opcode_variadic_p(op))) { + res = sexp_compile_error(ctx, "too many args for opcode", x); + } else { + res = analyze_app(ctx, sexp_cdr(x)); + if (! sexp_exceptionp(res)) + sexp_push(ctx, res, op); + } + } else { + res = analyze_app(ctx, x); + } + } + } else { + res = analyze_app(ctx, x); + if (!sexp_exceptionp(res) + && !(sexp_pairp(sexp_car(x)) + || (sexp_synclop(sexp_car(x)) + && sexp_pairp(sexp_synclo_expr(sexp_car(x)))))) + sexp_warn(ctx, "invalid operator in application: ", x); + } + } else if (sexp_idp(x)) { + res = analyze_var_ref(ctx, x, NULL); + } else if (sexp_synclop(x)) { + tmp = sexp_make_child_context(ctx, sexp_context_lambda(ctx)); + sexp_context_fv(tmp) = sexp_append2(tmp, + sexp_synclo_free_vars(x), + sexp_context_fv(tmp)); + sexp_context_env(tmp) = sexp_extend_synclo_env(tmp, sexp_synclo_env(x)); + x = sexp_synclo_expr(x); + res = analyze(tmp, x); + } else if (sexp_nullp(x)) { + res = sexp_compile_error(ctx, "empty application in source", x); + } else { + res = x; + } + if (sexp_exceptionp(res) && sexp_not(sexp_exception_source(res)) + && sexp_pairp(x)) + sexp_exception_source(res) = sexp_pair_source(x); + sexp_gc_release4(ctx); + return res; +} + +sexp sexp_analyze (sexp ctx, sexp x) {return analyze(ctx, x);} + +/********************** free varable analysis *************************/ + +static sexp insert_free_var (sexp ctx, sexp x, sexp fv) { + sexp name=sexp_ref_name(x), loc=sexp_ref_loc(x), ls; + for (ls=fv; sexp_pairp(ls); ls=sexp_cdr(ls)) + if ((name == sexp_ref_name(sexp_car(ls))) + && (loc == sexp_ref_loc(sexp_car(ls)))) + return fv; + return sexp_cons(ctx, x, fv); +} + +static sexp union_free_vars (sexp ctx, sexp fv1, sexp fv2) { + sexp_gc_var1(res); + if (sexp_nullp(fv2)) + return fv1; + sexp_gc_preserve1(ctx, res); + for (res=fv2; sexp_pairp(fv1); fv1=sexp_cdr(fv1)) + res = insert_free_var(ctx, sexp_car(fv1), res); + sexp_gc_release1(ctx); + return res; +} + +static sexp diff_free_vars (sexp ctx, sexp lambda, sexp fv, sexp params) { + sexp_gc_var1(res); + sexp_gc_preserve1(ctx, res); + res = SEXP_NULL; + for ( ; sexp_pairp(fv); fv=sexp_cdr(fv)) + if ((sexp_ref_loc(sexp_car(fv)) != lambda) + || (sexp_memq(NULL, sexp_ref_name(sexp_car(fv)), params) + == SEXP_FALSE)) + sexp_push(ctx, res, sexp_car(fv)); + sexp_gc_release1(ctx); + return res; +} + +sexp sexp_free_vars (sexp ctx, sexp x, sexp fv) { + sexp_gc_var2(fv1, fv2); + sexp_gc_preserve2(ctx, fv1, fv2); + fv1 = fv; + if (sexp_lambdap(x)) { + fv1 = sexp_free_vars(ctx, sexp_lambda_body(x), SEXP_NULL); + fv2 = sexp_flatten_dot(ctx, sexp_lambda_params(x)); + fv2 = sexp_append2(ctx, sexp_lambda_locals(x), fv2); + fv2 = diff_free_vars(ctx, x, fv1, fv2); + sexp_lambda_fv(x) = fv2; + fv1 = union_free_vars(ctx, fv2, fv); + } else if (sexp_pairp(x)) { + for ( ; sexp_pairp(x); x=sexp_cdr(x)) + fv1 = sexp_free_vars(ctx, sexp_car(x), fv1); + } else if (sexp_cndp(x)) { + fv1 = sexp_free_vars(ctx, sexp_cnd_test(x), fv); + fv1 = sexp_free_vars(ctx, sexp_cnd_pass(x), fv1); + fv1 = sexp_free_vars(ctx, sexp_cnd_fail(x), fv1); + } else if (sexp_seqp(x)) { + for (x=sexp_seq_ls(x); sexp_pairp(x); x=sexp_cdr(x)) + fv1 = sexp_free_vars(ctx, sexp_car(x), fv1); + } else if (sexp_setp(x)) { + fv1 = sexp_free_vars(ctx, sexp_set_value(x), fv); + fv1 = sexp_free_vars(ctx, sexp_set_var(x), fv1); + } else if (sexp_refp(x) && sexp_lambdap(sexp_ref_loc(x))) { + fv1 = insert_free_var(ctx, x, fv); + } else if (sexp_synclop(x)) { + fv1 = sexp_free_vars(ctx, sexp_synclo_expr(x), fv); + } + sexp_gc_release2(ctx); + return fv1; +} + +/************************ library procedures **************************/ + +sexp sexp_exception_type_op (sexp ctx, sexp self, sexp_sint_t n, sexp exn) { + sexp_assert_type(ctx, sexp_exceptionp, SEXP_EXCEPTION, exn); + return sexp_exception_kind(exn); +} + +sexp sexp_open_input_file_op (sexp ctx, sexp self, sexp_sint_t n, sexp path) { + FILE *in; + int count = 0; + sexp_assert_type(ctx, sexp_stringp, SEXP_STRING, path); + do { + if (count != 0) sexp_gc(ctx, NULL); + in = fopen(sexp_string_data(path), "r"); + } while (!in && sexp_out_of_file_descriptors() && !count++); + if (!in) + return sexp_user_exception(ctx, self, "couldn't open input file", path); +#if SEXP_USE_GREEN_THREADS + fcntl(fileno(in), F_SETFL, O_NONBLOCK); +#endif + return sexp_make_input_port(ctx, in, path); +} + +sexp sexp_open_output_file_op (sexp ctx, sexp self, sexp_sint_t n, sexp path) { + FILE *out; + int count = 0; + sexp_assert_type(ctx, sexp_stringp, SEXP_STRING, path); + do { + if (count != 0) sexp_gc(ctx, NULL); + out = fopen(sexp_string_data(path), "w"); + } while (!out && sexp_out_of_file_descriptors() && !count++); + if (!out) + return sexp_user_exception(ctx, self, "couldn't open output file", path); +#if SEXP_USE_GREEN_THREADS + fcntl(fileno(out), F_SETFL, O_NONBLOCK); +#endif + return sexp_make_output_port(ctx, out, path); +} + +sexp sexp_open_binary_input_file (sexp ctx, sexp self, sexp_sint_t n, sexp path) { + sexp res = sexp_open_input_file_op(ctx, self, n, path); + if (sexp_portp(res)) sexp_port_binaryp(res) = 1; + return res; +} + +sexp sexp_open_binary_output_file (sexp ctx, sexp self, sexp_sint_t n, sexp path) { + sexp res = sexp_open_output_file_op(ctx, self, n, path); + if (sexp_portp(res)) sexp_port_binaryp(res) = 1; + return res; +} + +sexp sexp_close_port_op (sexp ctx, sexp self, sexp_sint_t n, sexp port) { + sexp_assert_type(ctx, sexp_portp, SEXP_OPORT, port); + return sexp_finalize_port(ctx, self, n, port); +} + +#if SEXP_USE_STATIC_LIBS +#include "clibs.c" +static sexp_library_entry_t *sexp_find_static_library(const char *file) +{ + size_t base_len; + sexp_library_entry_t *entry; + + if (file[0] == '.' && file[1] == '/') + file += 2; + base_len = strlen(file) - strlen(sexp_so_extension); + if (strcmp(file + base_len, sexp_so_extension)) + return NULL; + for (entry = &sexp_static_libraries[0]; entry->name; entry++) + if (! strncmp(file, entry->name, base_len)) + return entry; + return NULL; +} +static sexp sexp_load_dl (sexp ctx, sexp file, sexp env) { + sexp_library_entry_t *entry = sexp_find_static_library(sexp_string_data(file)); + if (! entry) + return sexp_compile_error(ctx, "couldn't find builtin library", file); + return entry->init(ctx, NULL, 3, env, sexp_version, SEXP_ABI_IDENTIFIER); +} +#else +#define sexp_find_static_library(path) NULL +#if SEXP_USE_DL +#ifdef __MINGW32__ +#include +static sexp sexp_load_dl (sexp ctx, sexp file, sexp env) { + sexp_init_proc init; + HINSTANCE handle = LoadLibraryA(sexp_string_data(file)); + if(!handle) + return sexp_compile_error(ctx, "couldn't load dynamic library", file); + init = (sexp_init_proc) GetProcAddress(handle, "sexp_init_library"); + if(!init) { + FreeLibrary(handle); + return sexp_compile_error(ctx, "dynamic library has no sexp_init_library", file); + } + return init(ctx, NULL, 3, env, sexp_version, SEXP_ABI_IDENTIFIER); +} +#else +static sexp sexp_make_dl (sexp ctx, sexp file, void* handle) { + sexp res = sexp_alloc_type(ctx, dl, SEXP_DL); + sexp_dl_file(res) = file; + sexp_dl_handle(res) = handle; + return res; +} +static sexp sexp_load_dl (sexp ctx, sexp file, sexp env) { + sexp_init_proc init; + sexp_gc_var2(res, old_dl); + void *handle = dlopen(sexp_string_data(file), RTLD_LAZY); + if (! handle) + return sexp_compile_error(ctx, "couldn't load dynamic library", file); + init = dlsym(handle, "sexp_init_library"); + if (! init) { + dlclose(handle); + return sexp_compile_error(ctx, "dynamic library has no sexp_init_library", file); + } + sexp_gc_preserve2(ctx, res, old_dl); + old_dl = sexp_context_dl(ctx); + sexp_context_dl(ctx) = sexp_make_dl(ctx, file, handle); + res = init(ctx, NULL, 3, env, sexp_version, SEXP_ABI_IDENTIFIER); + sexp_context_dl(ctx) = old_dl; + sexp_gc_release2(ctx); + return res; +} +#endif +#endif +#endif + +sexp sexp_load_op (sexp ctx, sexp self, sexp_sint_t n, sexp source, sexp env) { +#if SEXP_USE_DL || SEXP_USE_STATIC_LIBS + char *suffix; +#endif + sexp out=SEXP_FALSE; + sexp_gc_var4(ctx2, x, in, res); + if (!env) env = sexp_context_env(ctx); + sexp_assert_type(ctx, sexp_envp, SEXP_ENV, env); +#if SEXP_USE_DL || SEXP_USE_STATIC_LIBS + suffix = sexp_stringp(source) ? sexp_string_data(source) + + sexp_string_length(source) - strlen(sexp_so_extension) : "..."; + if (strcmp(suffix, sexp_so_extension) == 0) { + res = sexp_load_dl(ctx, source, env); + } else { +#endif + res = SEXP_VOID; + if (sexp_iportp(source)) { + in = source; + } else { + sexp_assert_type(ctx, sexp_stringp, SEXP_STRING, source); + in = sexp_open_input_file(ctx, source); + } + sexp_gc_preserve4(ctx, ctx2, x, in, res); + out = sexp_current_error_port(ctx); + ctx2 = sexp_make_eval_context(ctx, sexp_context_stack(ctx), env, 0, 0); + sexp_context_parent(ctx2) = ctx; + sexp_context_tailp(ctx2) = 0; + if (sexp_exceptionp(in)) { + if (sexp_not(out)) out = sexp_current_error_port(ctx); + if (sexp_oportp(out)) + sexp_print_exception(ctx, in, out); + res = in; + } else { + sexp_port_sourcep(in) = 1; + while ((x=sexp_read(ctx, in)) != (sexp) SEXP_EOF) { + res = sexp_eval(ctx2, x, env); + if (sexp_exceptionp(res)) + break; + } + sexp_context_last_fp(ctx) = sexp_context_last_fp(ctx2); + if (x == SEXP_EOF) + res = SEXP_VOID; + sexp_close_port(ctx, in); + } + sexp_gc_release4(ctx); +#if SEXP_USE_DL || SEXP_USE_STATIC_LIBS + } +#endif + return res; +} + +sexp sexp_register_optimization (sexp ctx, sexp self, sexp_sint_t n, sexp f, sexp priority) { + sexp_assert_type(ctx, sexp_applicablep, SEXP_PROCEDURE, f); + sexp_assert_type(ctx, sexp_fixnump, SEXP_FIXNUM, priority); + sexp_push(ctx, sexp_global(ctx, SEXP_G_OPTIMIZATIONS), SEXP_VOID); + sexp_car(sexp_global(ctx, SEXP_G_OPTIMIZATIONS)) = sexp_cons(ctx, priority, f); + return SEXP_VOID; +} + +#if SEXP_USE_MATH + +#if SEXP_USE_BIGNUMS +#define maybe_convert_bignum(z) \ + else if (sexp_bignump(z)) d = sexp_bignum_to_double(z); +#else +#define maybe_convert_bignum(z) +#endif + +#if SEXP_USE_RATIOS +#define maybe_convert_ratio(z) \ + else if (sexp_ratiop(z)) d = sexp_ratio_to_double(z); +#else +#define maybe_convert_ratio(z) +#endif + +#if SEXP_USE_COMPLEX +#define maybe_convert_complex(z, f) \ + else if (sexp_complexp(z)) return sexp_complex_normalize(f(ctx, z)); +#define sexp_complex_dummy(ctx, z) 0 +#else +#define maybe_convert_complex(z, f) +#endif + +#define define_math_op(name, cname, f) \ + sexp name (sexp ctx, sexp self, sexp_sint_t n, sexp z) { \ + double d; \ + if (sexp_flonump(z)) \ + d = sexp_flonum_value(z); \ + else if (sexp_fixnump(z)) \ + d = (double)sexp_unbox_fixnum(z); \ + maybe_convert_ratio(z) \ + maybe_convert_bignum(z) \ + maybe_convert_complex(z, f) \ + else \ + return sexp_type_exception(ctx, self, SEXP_NUMBER, z); \ + return sexp_make_flonum(ctx, cname(d)); \ + } + +define_math_op(sexp_exp, exp, sexp_complex_exp) +define_math_op(sexp_log, log, sexp_complex_log) +define_math_op(sexp_sin, sin, sexp_complex_sin) +define_math_op(sexp_cos, cos, sexp_complex_cos) +define_math_op(sexp_tan, tan, sexp_complex_tan) +define_math_op(sexp_asin, asin, sexp_complex_asin) +define_math_op(sexp_acos, acos, sexp_complex_acos) +define_math_op(sexp_atan, atan, sexp_complex_atan) + +#if SEXP_USE_RATIOS +#define maybe_round_ratio(ctx, q, f) \ + if (sexp_ratiop(q)) return f(ctx, q); +#else +#define maybe_round_ratio(ctx, q, f) +#endif + +#define define_math_rounder(name, cname, f) \ + sexp name (sexp ctx, sexp self, sexp_sint_t n, sexp z) { \ + maybe_round_ratio(ctx, z, f) \ + if (sexp_flonump(z)) \ + return sexp_make_flonum(ctx, cname(sexp_flonum_value(z))); \ + else if (sexp_fixnump(z) || sexp_bignump(z)) \ + return z; \ + return sexp_type_exception(ctx, self, SEXP_NUMBER, z); \ + } + +static double even_round (double d) { + double res = round(d); + if (fabs(d - res) == 0.5 && ((long)res & 1)) + res += (res < 0) ? 1 : -1; + return res; +} + +define_math_rounder(sexp_round, even_round, sexp_ratio_round) +define_math_rounder(sexp_trunc, trunc, sexp_ratio_trunc) +define_math_rounder(sexp_floor, floor, sexp_ratio_floor) +define_math_rounder(sexp_ceiling, ceil, sexp_ratio_ceiling) + +sexp sexp_sqrt (sexp ctx, sexp self, sexp_sint_t n, sexp z) { +#if SEXP_USE_COMPLEX + int negativep = 0; +#endif + double d, r; + sexp_gc_var1(res); + if (sexp_flonump(z)) + d = sexp_flonum_value(z); + else if (sexp_fixnump(z)) + d = (double)sexp_unbox_fixnum(z); + maybe_convert_bignum(z) /* XXXX add bignum sqrt */ + maybe_convert_ratio(z) /* XXXX add ratio sqrt */ + maybe_convert_complex(z, sexp_complex_sqrt) + else + return sexp_type_exception(ctx, self, SEXP_NUMBER, z); + sexp_gc_preserve1(ctx, res); +#if SEXP_USE_COMPLEX + if (d < 0) { + negativep = 1; + d = -d; + } +#endif + r = sqrt(d); + if (sexp_fixnump(z) + && (((sexp_uint_t)r*(sexp_uint_t)r)==abs(sexp_unbox_fixnum(z)))) + res = sexp_make_fixnum(round(r)); + else + res = sexp_make_flonum(ctx, r); +#if SEXP_USE_COMPLEX + if (negativep) + res = sexp_make_complex(ctx, SEXP_ZERO, res); +#endif + sexp_gc_release1(ctx); + return res; +} + +#endif /* SEXP_USE_MATH */ + +#if SEXP_USE_RATIOS || !SEXP_USE_FLONUMS +sexp sexp_generic_expt (sexp ctx, sexp x, sexp_sint_t e) { + sexp_gc_var2(res, tmp); + sexp_gc_preserve2(ctx, res, tmp); + for (res = SEXP_ONE, tmp = x; e > 0; e >>= 1) { + if (e&1) res = sexp_mul(ctx, res, tmp); + tmp = sexp_mul(ctx, tmp, tmp); + } + sexp_gc_release2(ctx); + return res; +} +#endif + +sexp sexp_expt_op (sexp ctx, sexp self, sexp_sint_t n, sexp x, sexp e) { +#if !SEXP_USE_FLONUMS + sexp_assert_type(ctx, sexp_fixnump, SEXP_FIXNUM, x); + sexp_assert_type(ctx, sexp_fixnump, SEXP_FIXNUM, e); + return sexp_generic_expt(ctx, x, sexp_unbox_fixnum(e)); +#else + long double f, x1, e1; + sexp res; +#if SEXP_USE_COMPLEX + if (sexp_complexp(x) || sexp_complexp(e)) + return sexp_complex_expt(ctx, x, e); +#endif +#if SEXP_USE_BIGNUMS + if (sexp_bignump(e)) { /* bignum exponent needs special handling */ + if ((x == SEXP_ZERO) || (x == SEXP_NEG_ONE)) + res = sexp_make_flonum(ctx, pow(0, 0)); /* +nan.0 */ + else if (x == SEXP_ONE) + res = SEXP_ONE; /* 1.0 */ + else if (sexp_flonump(x)) + res = sexp_make_flonum(ctx, pow(sexp_flonum_value(x), sexp_bignum_to_double(e))); + else + res = sexp_make_flonum(ctx, pow(10.0, 1e100)); /* +inf.0 */ + } else if (sexp_bignump(x)) { + res = sexp_bignum_expt(ctx, x, e); + } else { +#endif + if (sexp_fixnump(x)) + x1 = sexp_unbox_fixnum(x); + else if (sexp_flonump(x)) + x1 = sexp_flonum_value(x); +#if SEXP_USE_RATIOS + else if (sexp_ratiop(x)) { + if (sexp_fixnump(e)) { + return sexp_generic_expt(ctx, x, sexp_unbox_fixnum(e)); + } else { + x1 = sexp_ratio_to_double(x); + } + } +#endif + else + return sexp_type_exception(ctx, self, SEXP_FIXNUM, x); + if (sexp_fixnump(e)) + e1 = sexp_unbox_fixnum(e); + else if (sexp_flonump(e)) + e1 = sexp_flonum_value(e); +#if SEXP_USE_RATIOS + else if (sexp_ratiop(e)) + e1 = sexp_ratio_to_double(e); +#endif + else + return sexp_type_exception(ctx, self, SEXP_FIXNUM, e); + f = pow(x1, e1); + if ((f*1000.0 > SEXP_MAX_FIXNUM) || (f*1000.0 < SEXP_MIN_FIXNUM) + || (! sexp_fixnump(x)) || (! sexp_fixnump(e))) { +#if SEXP_USE_BIGNUMS + if (sexp_fixnump(x) && sexp_fixnump(e)) + res = sexp_bignum_expt(ctx, sexp_fixnum_to_bignum(ctx, x), e); + else +#endif + res = sexp_make_flonum(ctx, f); + } else + res = sexp_make_fixnum((sexp_sint_t)round(f)); +#if SEXP_USE_BIGNUMS + } +#endif + return res; +#endif /* !SEXP_USE_FLONUMS */ +} + +#if SEXP_USE_RATIOS +sexp sexp_ratio_numerator_op (sexp ctx, sexp self, sexp_sint_t n, sexp rat) { + sexp_assert_type(ctx, sexp_ratiop, SEXP_RATIO, rat); + return sexp_ratio_numerator(rat); +} +sexp sexp_ratio_denominator_op (sexp ctx, sexp self, sexp_sint_t n, sexp rat) { + sexp_assert_type(ctx, sexp_ratiop, SEXP_RATIO, rat); + return sexp_ratio_denominator(rat); +} +#endif + +#if SEXP_USE_COMPLEX +sexp sexp_complex_real_op (sexp ctx, sexp self, sexp_sint_t n, sexp cpx) { + sexp_assert_type(ctx, sexp_complexp, SEXP_COMPLEX, cpx); + return sexp_complex_real(cpx); +} +sexp sexp_complex_imag_op (sexp ctx, sexp self, sexp_sint_t n, sexp cpx) { + sexp_assert_type(ctx, sexp_complexp, SEXP_COMPLEX, cpx); + return sexp_complex_imag(cpx); +} +#endif + +sexp sexp_string_cmp_op (sexp ctx, sexp self, sexp_sint_t n, sexp str1, sexp str2, sexp ci) { + sexp_sint_t len1, len2, len, diff; + sexp_assert_type(ctx, sexp_stringp, SEXP_STRING, str1); + sexp_assert_type(ctx, sexp_stringp, SEXP_STRING, str2); + len1 = sexp_string_length(str1); + len2 = sexp_string_length(str2); + len = ((len1>4)&1)+3; +} + +int sexp_utf8_char_byte_count (int c) { + if (c < 0x80) return 1; + if (c < 0x800) return 2; + if (c < 0x10000) return 3; + return 4; +} + +int sexp_string_utf8_length (unsigned char *p, int len) { + unsigned char *q = p+len; + int i; + for (i=0; p>6 == 2) + ; + return (char*)p; +} + +sexp sexp_string_utf8_ref (sexp ctx, sexp str, sexp i) { + unsigned char *p=(unsigned char*)sexp_string_data(str) + sexp_unbox_fixnum(i); + if (*p < 0x80) + return sexp_make_character(*p); + else if ((*p < 0xC0) || (*p > 0xF7)) + return sexp_user_exception(ctx, NULL, "string-ref: invalid utf8 byte", i); + else if (*p < 0xE0) + return sexp_make_character(((p[0]&0x3F)<<6) + (p[1]&0x3F)); + else if (*p < 0xF0) + return sexp_make_character(((p[0]&0x1F)<<12) + ((p[1]&0x3F)<<6) + (p[2]&0x3F)); + else + return sexp_make_character(((p[0]&0x0F)<<16) + ((p[1]&0x3F)<<6) + ((p[2]&0x3F)<<6) + (p[2]&0x3F)); +} + +sexp sexp_string_utf8_index_ref (sexp ctx, sexp self, sexp_sint_t n, sexp str, sexp i) { + sexp off; + sexp_assert_type(ctx, sexp_stringp, SEXP_STRING, str); + sexp_assert_type(ctx, sexp_fixnump, SEXP_FIXNUM, i); + off = sexp_string_index_to_offset(ctx, self, n, str, i); + if (sexp_exceptionp(off)) return off; + if (sexp_unbox_fixnum(off) >= sexp_string_length(str)) + return sexp_user_exception(ctx, self, "string-ref: index out of range", i); + return sexp_string_utf8_ref(ctx, str, off); +} + +sexp sexp_read_utf8_char (sexp ctx, sexp port, int i) { + if (i >= 0x80) { + if ((i < 0xC0) || (i > 0xF7)) { + return sexp_user_exception(ctx, NULL, "read-char: invalid utf8 byte", sexp_make_fixnum(i)); + } else if (i < 0xE0) { + i = ((i&0x3F)<<6) + (sexp_read_char(ctx, port)&0x3F); + } else if (i < 0xF0) { + i = ((i&0x1F)<<12) + ((sexp_read_char(ctx, port)&0x3F)<<6); + i += sexp_read_char(ctx, port)&0x3F; + } else { + i = ((i&0x0F)<<16) + ((sexp_read_char(ctx, port)&0x3F)<<6); + i += (sexp_read_char(ctx, port)&0x3F)<<6; + i += sexp_read_char(ctx, port)&0x3F; + } + } + return sexp_make_character(i); +} + +#if SEXP_USE_MUTABLE_STRINGS + +void sexp_string_utf8_set (sexp ctx, sexp str, sexp index, sexp ch) { + sexp b; + unsigned char *p, *q; + int i = sexp_unbox_fixnum(index), c = sexp_unbox_character(ch), + old_len, new_len, len; + p = (unsigned char*)sexp_string_data(str) + i; + old_len = sexp_utf8_initial_byte_count(*p); + new_len = sexp_utf8_char_byte_count(c); + if (old_len != new_len) { /* resize bytes if needed */ + len = sexp_string_length(str)+(new_len-old_len); + b = sexp_make_bytes(ctx, sexp_make_fixnum(len), SEXP_VOID); + if (! sexp_exceptionp(b)) { + q = (unsigned char*)sexp_bytes_data(b); + memcpy(q, sexp_string_data(str), i); + memcpy(q+i+new_len, p+old_len, len-i-new_len+1); + sexp_string_bytes(str) = b; + p = q + i; + } + sexp_string_length(str) += new_len - old_len; + } + sexp_utf8_encode_char(p, new_len, c); +} + +sexp sexp_string_utf8_index_set (sexp ctx, sexp self, sexp_sint_t n, sexp str, sexp i, sexp ch) { + sexp off; + sexp_assert_type(ctx, sexp_stringp, SEXP_STRING, str); + sexp_assert_type(ctx, sexp_fixnump, SEXP_FIXNUM, i); + sexp_assert_type(ctx, sexp_charp, SEXP_CHAR, ch); + off = sexp_string_index_to_offset(ctx, self, n, str, i); + if (sexp_exceptionp(off)) return off; + if (sexp_unbox_fixnum(off) >= sexp_string_length(str)) + return sexp_user_exception(ctx, self, "string-set!: index out of range", i); + sexp_string_utf8_set(ctx, str, off, ch); + return SEXP_VOID; +} + +#endif +#endif + +#if SEXP_USE_AUTO_FORCE +sexp sexp_make_promise (sexp ctx, sexp self, sexp_sint_t n, sexp done, sexp val) { + sexp res = sexp_alloc_type(ctx, promise, SEXP_PROMISE); + sexp_promise_donep(res) = sexp_unbox_boolean(done); + sexp_promise_value(res) = val; + return res; +} +#endif + +#ifdef PLAN9 +#include "opt/plan9.c" +#endif + +/************************** optimizations *****************************/ + +#if SEXP_USE_SIMPLIFY +#include "opt/simplify.c" +#else +#define sexp_rest_unused_p(lambda) 0 +#endif + +/***************************** opcodes ********************************/ + +#if SEXP_USE_TYPE_DEFS + +sexp sexp_type_slot_offset_op (sexp ctx , sexp self, sexp_sint_t n, sexp type, sexp slot) { + sexp cpl, slots, *v; + int i, offset=0, len; + sexp_assert_type(ctx, sexp_typep, SEXP_TYPE, type); + cpl = sexp_type_cpl(type); + if (sexp_vectorp(cpl)) { + v = sexp_vector_data(cpl); + len = sexp_vector_length(cpl); + } else { + v = &sexp_type_slots(type); + len = 1; + } + len = sexp_vectorp(cpl) ? sexp_vector_length(cpl) : 1; + for (i=0; ivalue), core, sizeof(core[0])); + return res; +} + +static sexp sexp_copy_opcode (sexp ctx, struct sexp_opcode_struct *op) { + sexp res = sexp_alloc_type(ctx, opcode, SEXP_OPCODE); + memcpy(&(res->value), op, sizeof(op[0])); + return res; +} + +sexp sexp_make_opcode (sexp ctx, sexp self, sexp name, sexp op_class, sexp code, + sexp num_args, sexp flags, sexp arg1t, sexp arg2t, + sexp invp, sexp data, sexp data2, sexp_proc1 func) { + sexp res; + sexp_assert_type(ctx, sexp_fixnump, SEXP_FIXNUM, num_args); + sexp_assert_type(ctx, sexp_fixnump, SEXP_FIXNUM, flags); + if ((! sexp_fixnump(op_class)) || (sexp_unbox_fixnum(op_class) <= 0) + || (sexp_unbox_fixnum(op_class) >= SEXP_OPC_NUM_OP_CLASSES)) + res = sexp_xtype_exception(ctx, self, "make-opcode: bad opcode class", op_class); + else if ((! sexp_fixnump(code)) || (sexp_unbox_fixnum(code) <= 0) + || (sexp_unbox_fixnum(code) >= SEXP_OP_NUM_OPCODES)) + res = sexp_xtype_exception(ctx, self, "make-opcode: bad opcode", code); + else { + res = sexp_alloc_type(ctx, opcode, SEXP_OPCODE); + sexp_opcode_class(res) = sexp_unbox_fixnum(op_class); + sexp_opcode_code(res) = sexp_unbox_fixnum(code); + sexp_opcode_num_args(res) = sexp_unbox_fixnum(num_args); + sexp_opcode_flags(res) = sexp_unbox_fixnum(flags); + sexp_opcode_arg1_type(res) = arg1t; + sexp_opcode_arg2_type(res) = arg2t; + sexp_opcode_inverse(res) = sexp_unbox_fixnum(invp); + sexp_opcode_data(res) = data; + sexp_opcode_data2(res) = data2; + sexp_opcode_func(res) = func; + sexp_opcode_name(res) = name; +#if SEXP_USE_DL + sexp_opcode_dl(res) = sexp_context_dl(ctx); +#endif + } + return res; +} + +sexp sexp_make_foreign (sexp ctx, const char *name, int num_args, + int flags, sexp_proc1 f, sexp data) { + sexp_gc_var1(res); + sexp_gc_preserve1(ctx, res); +#if ! SEXP_USE_EXTENDED_FCALL + if (num_args > 4) + return sexp_user_exception(ctx, NULL, "make-foreign: exceeded foreign arg limit", + sexp_make_fixnum(num_args)); +#endif + res = sexp_alloc_type(ctx, opcode, SEXP_OPCODE); + sexp_opcode_class(res) = SEXP_OPC_FOREIGN; +#if SEXP_USE_EXTENDED_FCALL + if (num_args > 4) + sexp_opcode_code(res) = SEXP_OP_FCALLN; + else +#endif + sexp_opcode_code(res) = SEXP_OP_FCALL1+num_args-1; + if (flags & 1) num_args--; + sexp_opcode_num_args(res) = num_args; + sexp_opcode_flags(res) = flags; + sexp_opcode_name(res) = sexp_c_string(ctx, name, -1); + sexp_opcode_data(res) = data; + sexp_opcode_func(res) = f; +#if SEXP_USE_DL + sexp_opcode_dl(res) = sexp_context_dl(ctx); +#endif + sexp_gc_release1(ctx); + return res; +} + +sexp sexp_define_foreign_aux (sexp ctx, sexp env, const char *name, int num_args, + int flags, sexp_proc1 f, sexp data) { + sexp_gc_var2(sym, res); + sexp_gc_preserve2(ctx, sym, res); + res = sexp_make_foreign(ctx, name, num_args, flags, f, data); + if (!sexp_exceptionp(res)) + sexp_env_define(ctx, env, sym = sexp_intern(ctx, name, -1), res); + sexp_gc_release2(ctx); + return res; +} + +sexp sexp_define_foreign_param (sexp ctx, sexp env, const char *name, + int num_args, sexp_proc1 f, const char *param) { + sexp res = SEXP_FALSE; + sexp_gc_var1(tmp); + sexp_gc_preserve1(ctx, tmp); + tmp = sexp_intern(ctx, param, -1); + tmp = sexp_env_ref(env, tmp, SEXP_FALSE); + if (sexp_opcodep(tmp)) + res = sexp_define_foreign_aux(ctx, env, name, num_args, 3, f, tmp); + sexp_gc_release1(ctx); + return res; +} + +/*********************** standard environment *************************/ + +static struct sexp_core_form_struct core_forms[] = { + {SEXP_CORE_DEFINE, (sexp)"define"}, + {SEXP_CORE_SET, (sexp)"set!"}, + {SEXP_CORE_LAMBDA, (sexp)"lambda"}, + {SEXP_CORE_IF, (sexp)"if"}, + {SEXP_CORE_BEGIN, (sexp)"begin"}, + {SEXP_CORE_QUOTE, (sexp)"quote"}, + {SEXP_CORE_SYNTAX_QUOTE, (sexp)"syntax-quote"}, + {SEXP_CORE_DEFINE_SYNTAX, (sexp)"define-syntax"}, + {SEXP_CORE_LET_SYNTAX, (sexp)"let-syntax"}, + {SEXP_CORE_LETREC_SYNTAX, (sexp)"letrec-syntax"}, +}; + +sexp sexp_make_env_op (sexp ctx, sexp self, sexp_sint_t n) { + sexp e = sexp_alloc_type(ctx, env, SEXP_ENV); + sexp_env_lambda(e) = NULL; + sexp_env_parent(e) = NULL; + sexp_env_bindings(e) = SEXP_NULL; +#if SEXP_USE_RENAME_BINDINGS + sexp_env_renames(e) = SEXP_NULL; +#endif + return e; +} + +sexp sexp_make_null_env_op (sexp ctx, sexp self, sexp_sint_t n, sexp version) { + sexp_uint_t i; + sexp_gc_var2(e, core); + sexp_gc_preserve2(ctx, e, core); + e = sexp_make_env(ctx); + for (i=0; i<(sizeof(core_forms)/sizeof(core_forms[0])); i++) { + core = sexp_copy_core(ctx, &core_forms[i]); + sexp_env_define(ctx, e, sexp_intern(ctx, (char*)sexp_core_name(core), -1), core); + sexp_core_name(core) = sexp_c_string(ctx, (char*)sexp_core_name(core), -1); + } + sexp_gc_release2(ctx); + return e; +} + +sexp sexp_make_primitive_env (sexp ctx, sexp version) { + int i; + sexp_gc_var4(e, op, sym, name); + sexp_gc_preserve4(ctx, e, op, sym, name); + e = sexp_make_null_env(ctx, version); + for (i=0; i<(sizeof(opcodes)/sizeof(opcodes[0])); i++) { + op = sexp_copy_opcode(ctx, &opcodes[i]); + name = sexp_intern(ctx, (char*)sexp_opcode_name(op), -1); + sexp_opcode_name(op) = sexp_c_string(ctx, (char*)sexp_opcode_name(op), -1); + if (sexp_opcode_opt_param_p(op) && sexp_opcode_data(op)) { + sym = sexp_intern(ctx, (char*)sexp_opcode_data(op), -1); + sexp_opcode_data(op) = sexp_env_ref(e, sym, SEXP_FALSE); + } else if (sexp_opcode_class(op) == SEXP_OPC_PARAMETER) { + sexp_opcode_data(op) = sexp_cons(ctx, name, SEXP_FALSE); + } + if (sexp_opcode_class(op) == SEXP_OPC_FOREIGN && sexp_opcode_data2(op)) { + sexp_opcode_data2(op) = sexp_c_string(ctx, (char*)sexp_opcode_data2(op), -1); + } + sexp_env_define(ctx, e, name, op); + } + sexp_gc_release4(ctx); + return e; +} + +sexp sexp_find_module_file (sexp ctx, const char *file) { + sexp res=SEXP_FALSE, ls; + char *dir, *path; + sexp_uint_t slash, dirlen, filelen, len; +#ifdef PLAN9 +#define file_exists_p(path, buf) (stat(path, buf, 128) >= 0) + unsigned char buf[128]; +#else +#define file_exists_p(path, buf) (! stat(path, buf)) + struct stat buf_str; + struct stat *buf = &buf_str; +#endif + + filelen = strlen(file); + + ls = sexp_global(ctx, SEXP_G_MODULE_PATH); + for ( ; sexp_pairp(ls) && sexp_not(res); ls=sexp_cdr(ls)) { + dir = sexp_string_data(sexp_car(ls)); + dirlen = sexp_string_length(sexp_car(ls)); + slash = dir[dirlen-1] == '/'; + len = dirlen+filelen+2-slash; + path = (char*) sexp_malloc(len); + if (! path) return sexp_global(ctx, SEXP_G_OOM_ERROR); + memcpy(path, dir, dirlen); + if (! slash) path[dirlen] = '/'; + memcpy(path+len-filelen-1, file, filelen); + path[len-1] = '\0'; + if (sexp_find_static_library(path) || file_exists_p(path, buf)) + res = sexp_c_string(ctx, path, len-1); + free(path); + } + + return res; +} + +#define sexp_file_not_found "couldn't find file in module path" + +sexp sexp_load_module_file (sexp ctx, const char *file, sexp env) { + sexp res; + sexp_gc_var1(path); + sexp_gc_preserve1(ctx, path); + path = sexp_find_module_file(ctx, file); + if (sexp_stringp(path)) { + res = sexp_load(ctx, path, env); + } else { + path = sexp_c_string(ctx, file, -1); + res = sexp_user_exception(ctx, SEXP_FALSE, sexp_file_not_found, path); + } + sexp_gc_release1(ctx); + return res; +} + +#if SEXP_USE_MODULES +sexp sexp_find_module_file_op (sexp ctx, sexp self, sexp_sint_t n, sexp file) { + sexp_assert_type(ctx, sexp_stringp, SEXP_STRING, file); + return sexp_find_module_file(ctx, sexp_string_data(file)); +} +sexp sexp_load_module_file_op (sexp ctx, sexp self, sexp_sint_t n, sexp file, sexp env) { + sexp_assert_type(ctx, sexp_stringp, SEXP_STRING, file); + sexp_assert_type(ctx, sexp_envp, SEXP_ENV, env); + return sexp_load_module_file(ctx, sexp_string_data(file), env); +} +sexp sexp_current_environment (sexp ctx, sexp self, sexp_sint_t n) { + return sexp_context_env(ctx); +} +sexp sexp_meta_environment (sexp ctx, sexp self, sexp_sint_t n) { + return sexp_global(ctx, SEXP_G_META_ENV); +} +#endif + +sexp sexp_add_module_directory_op (sexp ctx, sexp self, sexp_sint_t n, sexp dir, sexp appendp) { + sexp ls; + sexp_assert_type(ctx, sexp_stringp, SEXP_STRING, dir); + if (sexp_truep(appendp)) { + if (sexp_pairp(ls=sexp_global(ctx, SEXP_G_MODULE_PATH))) { + for ( ; sexp_pairp(sexp_cdr(ls)); ls=sexp_cdr(ls)) + ; + sexp_cdr(ls) = sexp_list1(ctx, dir); + } else { + sexp_global(ctx, SEXP_G_MODULE_PATH) = sexp_list1(ctx, dir); + } + } else { + sexp_push(ctx, sexp_global(ctx, SEXP_G_MODULE_PATH), dir); + } + return SEXP_VOID; +} + +sexp sexp_parameter_ref (sexp ctx, sexp param) { +#if SEXP_USE_GREEN_THREADS + sexp ls; + for (ls=sexp_context_params(ctx); sexp_pairp(ls); ls=sexp_cdr(ls)) + if (sexp_caar(ls) == param) + return sexp_cdar(ls); +#endif + return sexp_opcodep(param) && sexp_opcode_data(param) && sexp_pairp(sexp_opcode_data(param)) + ? sexp_cdr(sexp_opcode_data(param)) : SEXP_FALSE; +} + +#if SEXP_USE_GREEN_THREADS +sexp sexp_dk (sexp ctx, sexp self, sexp_sint_t n, sexp val) { + if (sexp_not(val)) { + return sexp_context_dk(ctx) ? sexp_context_dk(ctx) : SEXP_FALSE; + } else { + sexp_context_dk(ctx) = val; + return SEXP_VOID; + } +} + +sexp sexp_thread_parameters (sexp ctx, sexp self, sexp_sint_t n) { + sexp res = sexp_context_params(ctx); + return res ? res : SEXP_NULL; +} + +sexp sexp_thread_parameters_set (sexp ctx, sexp self, sexp_sint_t n, sexp new) { + sexp_context_params(ctx) = new; + return SEXP_VOID; +} +#endif + +void sexp_set_parameter (sexp ctx, sexp env, sexp name, sexp value) { + sexp param = sexp_env_ref(env, name, SEXP_FALSE); + if (sexp_opcodep(param)) { + if (! sexp_pairp(sexp_opcode_data(param))) + sexp_opcode_data(param) = sexp_cons(ctx, name, value); + else + sexp_cdr(sexp_opcode_data(param)) = value; + } +} + +sexp sexp_load_standard_ports (sexp ctx, sexp env, FILE* in, FILE* out, + FILE* err, int no_close) { + sexp_gc_var1(p); + sexp_gc_preserve1(ctx, p); + if (!env) env = sexp_context_env(ctx); + if (in) { + p = sexp_make_input_port(ctx, in, SEXP_FALSE); + sexp_port_no_closep(p) = no_close; + sexp_set_parameter(ctx, env, sexp_global(ctx, SEXP_G_CUR_IN_SYMBOL), p); + } + if (out) { + p = sexp_make_output_port(ctx, out, SEXP_FALSE); + sexp_port_no_closep(p) = no_close; + sexp_set_parameter(ctx, env, sexp_global(ctx, SEXP_G_CUR_OUT_SYMBOL), p); + } + if (err) { + p = sexp_make_output_port(ctx, err, SEXP_FALSE); + sexp_port_no_closep(p) = no_close; + sexp_set_parameter(ctx, env, sexp_global(ctx, SEXP_G_CUR_ERR_SYMBOL), p); + } + sexp_gc_release1(ctx); + return SEXP_VOID; +} + +static const char* sexp_initial_features[] = { + sexp_platform, +#if SEXP_BSD + "bsd", +#endif +#if defined(_WIN32) || defined(__MINGW32__) + "windows", +#endif +#if SEXP_USE_DL + "dynamic-loading", +#endif +#if SEXP_USE_BIDIRECTIONAL_PORTS + "bidir-ports", +#endif +#if SEXP_USE_STRING_STREAMS + "string-streams", +#endif +#if SEXP_USE_MODULES + "modules", +#endif +#if SEXP_USE_BOEHM + "boehm-gc", +#endif +#if SEXP_USE_UTF8_STRINGS + "full-unicode", +#endif +#if SEXP_USE_GREEN_THREADS + "threads", +#endif +#if SEXP_USE_AUTO_FORCE + "auto-force", +#endif +#if SEXP_USE_COMPLEX + "complex", +#endif +#if SEXP_USE_RATIOS + "ratios", +#endif + "r7rs", + "chibi", + NULL, +}; + +sexp sexp_load_standard_env (sexp ctx, sexp e, sexp version) { + int len; + char init_file[128]; + const char** features; + int endianess_check = 1; + sexp_gc_var3(op, tmp, sym); + sexp_gc_preserve3(ctx, op, tmp, sym); + if (!e) e = sexp_context_env(ctx); + sexp_env_define(ctx, e, sym=sexp_intern(ctx, "*shared-object-extension*", -1), + tmp=sexp_c_string(ctx, sexp_so_extension, -1)); + tmp = SEXP_NULL; + sexp_push(ctx, tmp, sym=sexp_intern(ctx, (*(unsigned char*) &endianess_check) ? "little-endian" : "big-endian", -1)); + for (features=sexp_initial_features; *features; features++) + sexp_push(ctx, tmp, sym=sexp_intern(ctx, *features, -1)); + sexp_env_define(ctx, e, sym=sexp_intern(ctx, "*features*", -1), tmp); + sexp_global(ctx, SEXP_G_OPTIMIZATIONS) = SEXP_NULL; +#if SEXP_USE_SIMPLIFY + op = sexp_make_foreign(ctx, "sexp_simplify", 1, 0, + (sexp_proc1)sexp_simplify, SEXP_VOID); + tmp = sexp_cons(ctx, sexp_make_fixnum(500), op); + sexp_push(ctx, sexp_global(ctx, SEXP_G_OPTIMIZATIONS), tmp); +#endif + sexp_global(ctx, SEXP_G_ERR_HANDLER) + = sexp_env_ref(e, sym=sexp_intern(ctx, "current-exception-handler", -1), SEXP_FALSE); + /* load init.scm */ + len = strlen(sexp_init_file); + strncpy(init_file, sexp_init_file, len); + init_file[len] = sexp_unbox_fixnum(version) + '0'; + strncpy(init_file + len + 1, sexp_init_file_suffix, strlen(sexp_init_file_suffix)); + init_file[len + 1 + strlen(sexp_init_file_suffix)] = 0; + tmp = sexp_load_module_file(ctx, init_file, e); + sexp_set_parameter(ctx, e, sexp_global(ctx, SEXP_G_INTERACTION_ENV_SYMBOL), e); + /* load and bind config env */ +#if SEXP_USE_MODULES + if (!sexp_exceptionp(tmp)) { + if (!sexp_envp(tmp=sexp_global(ctx, SEXP_G_META_ENV))) { + tmp = sexp_make_env(ctx); + if (! sexp_exceptionp(tmp)) { + sexp_global(ctx, SEXP_G_META_ENV) = tmp; + sexp_env_parent(tmp) = e; + op = sexp_load_module_file(ctx, sexp_meta_file, tmp); + if (sexp_exceptionp(op)) + sexp_print_exception(ctx, op, sexp_current_error_port(ctx)); + } + } + if (!sexp_exceptionp(tmp)) { + sym = sexp_intern(ctx, "repl-import", -1); + tmp = sexp_env_ref(tmp, sym, SEXP_VOID); + sym = sexp_intern(ctx, "import", -1); + sexp_env_define(ctx, e, sym, tmp); + } + } +#endif + sexp_gc_release3(ctx); + return sexp_exceptionp(tmp) ? tmp : e; +} + +sexp sexp_make_standard_env_op (sexp ctx, sexp self, sexp_sint_t n, sexp version) { + sexp_gc_var1(env); + sexp_gc_preserve1(ctx, env); + env = sexp_make_primitive_env(ctx, version); + if (! sexp_exceptionp(env)) env = sexp_load_standard_env(ctx, env, version); + sexp_gc_release1(ctx); + return env; +} + +#if SEXP_USE_RENAME_BINDINGS +#define sexp_same_bindingp(x, y) ((x) == (y)) +#else +#define sexp_same_bindingp(x, y) (sexp_env_value(x) == sexp_env_value(y)) +#endif + +sexp sexp_env_import_op (sexp ctx, sexp self, sexp_sint_t n, sexp to, sexp from, sexp ls, sexp immutp) { + sexp oldname, newname; + sexp_gc_var2(value, oldcell); + sexp_gc_preserve2(ctx, value, oldcell); + if (! sexp_envp(to)) to = sexp_context_env(ctx); + if (! sexp_envp(from)) from = sexp_context_env(ctx); + value = sexp_make_env(ctx); + sexp_env_parent(value) = sexp_env_parent(to); + sexp_env_parent(to) = value; + sexp_immutablep(value) = sexp_truep(immutp); + if (sexp_not(ls)) { + sexp_env_bindings(value) = sexp_env_bindings(from); +#if SEXP_USE_RENAME_BINDINGS + sexp_env_renames(value) = sexp_env_renames(from); +#endif + } else { + for ( ; sexp_pairp(ls); ls=sexp_cdr(ls)) { + if (sexp_pairp(sexp_car(ls))) { + newname = sexp_caar(ls); oldname = sexp_cdar(ls); + } else { + newname = oldname = sexp_car(ls); + } + oldcell = sexp_env_cell(to, newname, 0); + value = sexp_env_cell(from, oldname, 0); + if (value) { +#if SEXP_USE_RENAME_BINDINGS + sexp_env_rename(ctx, to, newname, value); +#else + sexp_env_define(ctx, to, newname, sexp_cdr(value)); +#endif +#if SEXP_USE_WARN_UNDEFS + if (oldcell && !sexp_same_bindingp(oldcell, value)) + sexp_warn(ctx, "importing already defined binding: ", newname); + } else { + sexp_warn(ctx, "importing undefined variable: ", oldname); +#endif + } + } + } + sexp_gc_release2(ctx); + return SEXP_VOID; +} + +/************************* backend ***************************/ + +#if SEXP_USE_NATIVE_X86 +#include "opt/x86.c" +#else +#include "vm.c" +#endif + +/************************** eval interface ****************************/ + +sexp sexp_compile_op (sexp ctx, sexp self, sexp_sint_t n, sexp obj, sexp env) { + sexp_gc_var3(ast, vec, res); + sexp ctx2; + if (! env) env = sexp_context_env(ctx); + sexp_assert_type(ctx, sexp_envp, SEXP_ENV, env); + sexp_gc_preserve3(ctx, ast, vec, res); + ctx2 = sexp_make_eval_context(ctx, NULL, env, 0, 0); + sexp_context_child(ctx) = ctx2; + sexp_context_dk(ctx2) = sexp_list1(ctx2, SEXP_FALSE); + ast = sexp_analyze(ctx2, obj); + if (sexp_exceptionp(ast)) { + res = ast; + } else { + res = sexp_global(ctx2, SEXP_G_OPTIMIZATIONS); + for ( ; sexp_pairp(res); res=sexp_cdr(res)) + ast = sexp_apply1(ctx2, sexp_cdar(res), ast); + sexp_free_vars(ctx2, ast, SEXP_NULL); /* should return SEXP_NULL */ + emit_enter(ctx2); + generate(ctx2, 0, 0, 0, ast); + res = finalize_bytecode(ctx2); + vec = sexp_make_vector(ctx2, 0, SEXP_VOID); + res = sexp_make_procedure(ctx2, SEXP_ZERO, SEXP_ZERO, res, vec); + } + sexp_context_child(ctx) = SEXP_FALSE; + sexp_context_last_fp(ctx) = sexp_context_last_fp(ctx2); + sexp_gc_release3(ctx); + return res; +} + +sexp sexp_eval_op (sexp ctx, sexp self, sexp_sint_t n, sexp obj, sexp env) { + sexp_sint_t top; + sexp ctx2; + sexp_gc_var2(res, params); + if (! env) env = sexp_context_env(ctx); + sexp_assert_type(ctx, sexp_envp, SEXP_ENV, env); + sexp_gc_preserve2(ctx, res, params); + top = sexp_context_top(ctx); + params = sexp_context_params(ctx); + sexp_context_params(ctx) = SEXP_NULL; + ctx2 = sexp_make_eval_context(ctx, sexp_context_stack(ctx), env, 0, 0); + sexp_context_child(ctx) = ctx2; + sexp_context_dk(ctx2) = sexp_list1(ctx, SEXP_FALSE); + res = sexp_compile_op(ctx2, self, n, obj, env); + if (! sexp_exceptionp(res)) + res = sexp_apply(ctx2, res, SEXP_NULL); + sexp_context_child(ctx) = SEXP_FALSE; + sexp_context_params(ctx) = params; + sexp_context_top(ctx) = top; + sexp_context_last_fp(ctx) = sexp_context_last_fp(ctx2); + sexp_gc_release2(ctx); + return res; +} + +sexp sexp_eval_string (sexp ctx, const char *str, sexp_sint_t len, sexp env) { + sexp res; + sexp_gc_var1(obj); + sexp_gc_preserve1(ctx, obj); + obj = sexp_read_from_string(ctx, str, len); + res = sexp_eval(ctx, obj, env); + sexp_gc_release1(ctx); + return res; +} + +void sexp_scheme_init (void) { + if (! scheme_initialized_p) { + scheme_initialized_p = 1; + sexp_init(); + } +} diff --git a/examples/echo-server.scm b/examples/echo-server.scm new file mode 100644 index 00000000..22b569f1 --- /dev/null +++ b/examples/echo-server.scm @@ -0,0 +1,38 @@ + +(import (scheme) (srfi 18) (chibi net) (chibi io) (chibi filesystem)) + +;; Copy each input line to output. +(define (echo-handler in out) + (let ((line (read-line in))) + (cond + ((not (eof-object? line)) + (display line out) + (newline out) + (flush-output out) + (echo-handler in out))))) + +;; Run a handler in a separate thread on the input and output ports, +;; then cleanup. +(define (run-io-handler sock handler) + (let ((in (open-input-file-descriptor sock)) + (out (open-output-file-descriptor sock))) + (thread-start! + (make-thread + (lambda () + (handler in out) + (close-input-port in) + (close-output-port out) + (close-file-descriptor sock)))))) + +;; Basic server loop - repeatedly call accept, and dispatch the new +;; socket to a handler. +(define (serve host port) + (let* ((addrinfo (get-address-info host port)) + (sock (make-listener-socket addrinfo))) + (do () (#f) + (let ((fd (accept sock + (address-info-address addrinfo) + (address-info-address-length addrinfo)))) + (run-io-handler fd echo-handler))))) + +(serve "localhost" 5556) diff --git a/fedora.spec b/fedora.spec new file mode 100644 index 00000000..e9beb325 --- /dev/null +++ b/fedora.spec @@ -0,0 +1,59 @@ +Summary: A small-footprint Scheme for use as a C Extension Language +Name: chibi-scheme +Version: 0.4 +Release: 1%{?dist} + + +Source0: http://chibi-scheme.googlecode.com/files/chibi-scheme-0.4.tgz +Patch1: chibi-scheme.Makefile.patch +Group: Development/Tools +License: BSD +URL: http://code.google.com/p/chibi-scheme/ +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +# BuildRequires: + + +%description +Chibi-Scheme is a very small library intended for use as an extension +and scripting language in C programs. In addition to support for +lightweight VM-based threads, each VM itself runs in an isolated heap +allowing multiple VMs to run simultaneously in different OS threads. + +%prep +%setup -q -n %{name}-%{version} +%patch1 + +%build +%{__make} PREFIX=%{_prefix} DESTDIR=%{RPM_BUILD_ROOT} LIBDIR=%{_libdir} SOLIBDIR=%{_libdir} MODDIR=%{_datarootdir}/chibi-scheme doc all + +%install +rm -rf $RPM_BUILD_ROOT + +mkdir -p ${RPM_BUILD_ROOT} +%{__make} PREFIX=%{_prefix} DESTDIR=${RPM_BUILD_ROOT} LIBDIR=%{_libdir} SOLIBDIR=%{_libdir} LDFLAGS="-C ${RPM_BUILD_ROOT}%{_sysconfdir}/ld.so.conf.d" MODDIR=%{_datarootdir}/chibi-scheme install + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root,-) +%{_bindir}/chibi-scheme +%{_datarootdir}/chibi-scheme +%{_datarootdir}/man +%{_libdir}/libchibi-scheme.so + + +%package devel +Summary: Development files for the %{name} package. +%description devel +This package contains development and include +files for %{name} package. + +%files devel +%defattr(-,root,root,-) +%{_includedir} + +%changelog +* Sat May 28 2011 Alex Shinn - 0.4 +* Wed Apr 22 2011 Rajesh Krishnan - 0.3 +- Initial release diff --git a/gc.c b/gc.c new file mode 100644 index 00000000..88fcca86 --- /dev/null +++ b/gc.c @@ -0,0 +1,721 @@ +/* gc.c -- simple mark&sweep garbage collector */ +/* Copyright (c) 2009-2011 Alex Shinn. All rights reserved. */ +/* BSD-style license: http://synthcode.com/license.txt */ + +#include "chibi/sexp.h" + +#if SEXP_USE_MMAP_GC +#include +#endif + +#ifdef __APPLE__ +#define SEXP_RTLD_DEFAULT RTLD_SELF +#else +#define SEXP_RTLD_DEFAULT RTLD_DEFAULT +#endif + +#define SEXP_BANNER(x) ("**************** GC "x"\n") + +#define SEXP_MINIMUM_OBJECT_SIZE (sexp_heap_align(1)) + +#if SEXP_USE_GLOBAL_HEAP +sexp_heap sexp_global_heap; +#endif + +#if SEXP_USE_CONSERVATIVE_GC +static sexp* stack_base; +#endif + +#if SEXP_USE_DEBUG_GC +#define sexp_debug_printf(fmt, ...) fprintf(stderr, SEXP_BANNER(fmt),__VA_ARGS__) +#else +#define sexp_debug_printf(fmt, ...) +#endif + +static sexp_heap sexp_heap_last (sexp_heap h) { + while (h->next) h = h->next; + return h; +} + +static size_t sexp_heap_total_size (sexp_heap h) { + size_t total_size = 0; + for (; h; h=h->next) + total_size += h->size; + return total_size; +} + +#if ! SEXP_USE_GLOBAL_HEAP +void sexp_free_heap (sexp_heap heap) { +#if SEXP_USE_MMAP_GC + munmap(heap, sexp_heap_pad_size(heap->size)); +#else + free(heap); +#endif +} +#endif + +#if SEXP_USE_LIMITED_MALLOC +static sexp_sint_t allocated_bytes=0, max_allocated_bytes=-1; +void* sexp_malloc(size_t size) { + char* max_alloc; + void* res; + if (max_allocated_bytes < 0) { + max_alloc = getenv("CHIBI_MAX_ALLOC"); + max_allocated_bytes = max_alloc ? atoi(max_alloc) : 8192000; /* 8MB */ + } + if (max_allocated_bytes > 0 && allocated_bytes + size > max_allocated_bytes) + return NULL; + if (!(res = malloc(size))) return NULL; + allocated_bytes += size; + return res; +} +/* TODO: subtract freed memory from max_allocated_bytes */ +void sexp_free(void* ptr) { + free(ptr); +} +#endif + +void sexp_preserve_object(sexp ctx, sexp x) { + sexp_global(ctx, SEXP_G_PRESERVATIVES) = sexp_cons(ctx, x, sexp_global(ctx, SEXP_G_PRESERVATIVES)); +} + +void sexp_release_object(sexp ctx, sexp x) { + sexp ls1, ls2; + for (ls1=NULL, ls2=sexp_global(ctx, SEXP_G_PRESERVATIVES); sexp_pairp(ls2); + ls1=ls2, ls2=sexp_cdr(ls2)) + if (sexp_car(ls2) == x) { + if (ls1) sexp_cdr(ls1) = sexp_cdr(ls2); + else sexp_global(ctx, SEXP_G_PRESERVATIVES) = ls2; + } +} + +sexp_uint_t sexp_allocated_bytes (sexp ctx, sexp x) { + sexp_uint_t res; + sexp t; + if (!sexp_pointerp(x) || (sexp_pointer_tag(x) >= sexp_context_num_types(ctx))) + return sexp_heap_align(1); + t = sexp_object_type(ctx, x); + res = sexp_type_size_of_object(t, x); +#if SEXP_USE_DEBUG_GC + if (res == 0) { + fprintf(stderr, SEXP_BANNER("%p zero-size object: %p"), ctx, x); + return 1; + } +#endif + return res; +} + +#if SEXP_USE_SAFE_GC_MARK + +#if SEXP_USE_DEBUG_GC > 2 +int sexp_valid_heap_position(sexp ctx, sexp_heap h, sexp x) { + sexp p = sexp_heap_first_block(h), end = sexp_heap_end(h); + sexp_free_list q = h->free_list, r; + while (p < end) { + for (r=q->next; r && ((char*)r<(char*)p); q=r, r=r->next) + ; + if ((char*)r == (char*)p) { + p = (sexp) (((char*)p) + r->size); + continue; + } + if (p == x) { + return 1; + } else if (p > x) { + fprintf(stderr, SEXP_BANNER("bad heap position: %p free: %p-%p : %p-%p"), + x, q, ((char*)q)+q->size, r, ((char*)r)+r->size); + return 0; + } + p = (sexp) (((char*)p)+sexp_heap_align(sexp_allocated_bytes(ctx, p))); + } + fprintf(stderr, SEXP_BANNER("bad heap position: %p heap: %p-%p"), x, h, end); + return 0; +} +#else +#define sexp_valid_heap_position(ctx, h, x) 1 +#endif + +int sexp_in_heap_p(sexp ctx, sexp x) { + sexp_heap h; + if ((sexp_uint_t)x & (sexp_heap_align(1)-1)) { + fprintf(stderr, SEXP_BANNER("invalid heap alignment: %p"), x); + return 0; + } + for (h=sexp_context_heap(ctx); h; h=h->next) + if (((sexp)h < x) && (x < (sexp)(h->data + h->size))) + return sexp_valid_heap_position(ctx, h, x); + fprintf(stderr, SEXP_BANNER("invalid object outside heap: %p"), x); + return 0; +} +#endif + +#if SEXP_USE_DEBUG_GC > 1 +int sexp_valid_object_type_p (sexp ctx, sexp x) { + if (sexp_pointer_tag(x)<=0 || sexp_pointer_tag(x)>sexp_context_num_types(ctx)){ + fprintf(stderr, SEXP_BANNER("%p mark: bad object at %p: tag: %d"), + ctx, x, sexp_pointer_tag(x)); + return 0; + } + return 1; +} +#else +#define sexp_valid_object_type_p(ctx, x) 1 +#endif + +#if SEXP_USE_HEADER_MAGIC +int sexp_valid_header_magic_p (sexp ctx, sexp x) { + if (sexp_pointer_magic(x) != SEXP_POINTER_MAGIC + && sexp_pointer_tag(x) != SEXP_TYPE && sexp_pointer_tag(x) != SEXP_OPCODE + && sexp_pointer_tag(x) != SEXP_CORE && sexp_pointer_tag(x) != SEXP_STACK) { + fprintf(stderr, SEXP_BANNER("%p mark: bad magic at %p: %x"), + ctx, x, sexp_pointer_magic(x)); + return 0; + } + return 1; +} +#else +#define sexp_valid_header_magic_p(ctx, x) 1 +#endif + +#if SEXP_DEBUG_GC > 1 || SEXP_USE_SAFE_GC_MARK || SEXP_USE_HEADER_MAGIC +int sexp_valid_object_p (sexp ctx, sexp x) { + return sexp_in_heap_p(ctx, x) && sexp_valid_object_type_p(ctx, x) + && sexp_valid_header_magic_p(ctx, x); +} +#endif + +void sexp_mark (sexp ctx, sexp x) { + sexp_sint_t len; + sexp t, *p, *q; + struct sexp_gc_var_t *saves; + loop: + if (!x || !sexp_pointerp(x) || !sexp_valid_object_p(ctx, x) || sexp_markedp(x)) + return; + sexp_markedp(x) = 1; + if (sexp_contextp(x)) + for (saves=sexp_context_saves(x); saves; saves=saves->next) + if (saves->var) sexp_mark(ctx, *(saves->var)); + t = sexp_object_type(ctx, x); + len = sexp_type_num_slots_of_object(t, x) - 1; + if (len >= 0) { + p = (sexp*) (((char*)x) + sexp_type_field_base(t)); + q = p + len; + while (p < q && ! (*q && sexp_pointerp(*q))) + q--; /* skip trailing immediates */ + while (p < q && *q == q[-1]) + q--; /* skip trailing duplicates */ + while (p < q) + sexp_mark(ctx, *p++); + x = *p; + goto loop; + } +} + +#if SEXP_USE_CONSERVATIVE_GC + +int stack_references_pointer_p (sexp ctx, sexp x) { + sexp *p; + for (p=(&x)+1; pnext) { /* just scan the whole heap */ + p = sexp_heap_first_block(h); + q = h->free_list; + end = sexp_heap_end(h); + while (p < end) { + for (r=q->next; r && ((char*)r<(char*)p); q=r, r=r->next) + ; + if ((char*)r == (char*)p) { + p = (sexp) (((char*)p) + r->size); + continue; + } + if (!sexp_markedp(p) && stack_references_pointer_p(ctx, p)) { +#ifdef SEXP_USE_CONSERVATIVE_GC_PRESERVE_TAG + if (sexp_pointer_tag(p) == SEXP_USE_CONSERVATIVE_GC_PRESERVE_TAG) +#endif + if (1) { +#if SEXP_USE_DEBUG_GC > 3 + if (p && sexp_pointerp(p)) { + fprintf(stderr, SEXP_BANNER("MISS: %p [%d]: %s"), p, + sexp_pointer_tag(p), sexp_pointer_source(p)); + fflush(stderr); + } +#endif + sexp_mark(ctx, p); + } + } + p = (sexp) (((char*)p)+sexp_heap_align(sexp_allocated_bytes(ctx, p))); + } + } +} + +#else +#define sexp_conservative_mark(ctx) +#endif + +#if SEXP_USE_WEAK_REFERENCES +void sexp_reset_weak_references(sexp ctx) { + int i, len, all_reset_p; + sexp_heap h = sexp_context_heap(ctx); + sexp p, t, end, *v; + sexp_free_list q, r; + for ( ; h; h=h->next) { /* just scan the whole heap */ + p = sexp_heap_first_block(h); + q = h->free_list; + end = sexp_heap_end(h); + while (p < end) { + /* find the preceding and succeeding free list pointers */ + for (r=q->next; r && ((char*)r<(char*)p); q=r, r=r->next) + ; + if ((char*)r == (char*)p) { /* this is a free block, skip it */ + p = (sexp) (((char*)p) + r->size); + continue; + } + if (sexp_valid_object_p(ctx, p) && sexp_markedp(p)) { + t = sexp_object_type(ctx, p); + if (sexp_type_weak_base(t) > 0) { + all_reset_p = 1; + v = (sexp*) ((char*)p + sexp_type_weak_base(t)); + len = sexp_type_num_weak_slots_of_object(t, p); + for (i=0; inext) { + p = sexp_heap_first_block(h); + q = h->free_list; + end = sexp_heap_end(h); + while (p < end) { + /* find the preceding and succeeding free list pointers */ + for (r=q->next; r && ((char*)r<(char*)p); q=r, r=r->next) + ; + if ((char*)r == (char*)p) { /* this is a free block, skip it */ + p = (sexp) (((char*)p) + r->size); + continue; + } + size = sexp_heap_align(sexp_allocated_bytes(ctx, p)); + if (!sexp_markedp(p)) { + t = sexp_object_type(ctx, p); + finalizer = sexp_type_finalize(t); + if (finalizer) { + finalize_count++; +#if SEXP_USE_DL + if (sexp_type_tag(t) == SEXP_DL && pass <= 0) + free_dls = 1; + else +#endif + finalizer(ctx, NULL, 1, p); + } + } + p = (sexp) (((char*)p)+size); + } + } +#if SEXP_USE_DL + if (free_dls && pass++ <= 0) goto loop; +#endif + return sexp_make_fixnum(finalize_count); +} + +sexp sexp_sweep (sexp ctx, size_t *sum_freed_ptr) { + size_t freed, max_freed=0, sum_freed=0, size; + sexp_heap h = sexp_context_heap(ctx); + sexp p, end; + sexp_free_list q, r, s; + /* scan over the whole heap */ + for ( ; h; h=h->next) { + p = sexp_heap_first_block(h); + q = h->free_list; + end = sexp_heap_end(h); + while (p < end) { + /* find the preceding and succeeding free list pointers */ + for (r=q->next; r && ((char*)r<(char*)p); q=r, r=r->next) + ; + if ((char*)r == (char*)p) { /* this is a free block, skip it */ + p = (sexp) (((char*)p) + r->size); + continue; + } + size = sexp_heap_align(sexp_allocated_bytes(ctx, p)); +#if SEXP_USE_DEBUG_GC + if (!sexp_valid_object_p(ctx, p)) + fprintf(stderr, SEXP_BANNER("%p sweep: invalid object at %p"), ctx, p); + if ((char*)q + q->size > (char*)p) + fprintf(stderr, SEXP_BANNER("%p sweep: bad size at %p < %p + %lu"), + ctx, p, q, q->size); + if (r && ((char*)p)+size > (char*)r) + fprintf(stderr, SEXP_BANNER("%p sweep: bad size at %p + %lu > %p"), + ctx, p, size, r); +#endif + if (!sexp_markedp(p)) { + /* free p */ + sum_freed += size; + if (((((char*)q) + q->size) == (char*)p) && (q != h->free_list)) { + /* merge q with p */ + if (r && r->size && ((((char*)p)+size) == (char*)r)) { + /* ... and with r */ + q->next = r->next; + freed = q->size + size + r->size; + p = (sexp) (((char*)p) + size + r->size); + } else { + freed = q->size + size; + p = (sexp) (((char*)p)+size); + } + q->size = freed; + } else { + s = (sexp_free_list)p; + if (r && r->size && ((((char*)p)+size) == (char*)r)) { + /* merge p with r */ + s->size = size + r->size; + s->next = r->next; + q->next = s; + freed = size + r->size; + } else { + s->size = size; + s->next = r; + q->next = s; + freed = size; + } + p = (sexp) (((char*)p)+freed); + } + if (freed > max_freed) + max_freed = freed; + } else { + sexp_markedp(p) = 0; + p = (sexp) (((char*)p)+size); + } + } + } + if (sum_freed_ptr) *sum_freed_ptr = sum_freed; + return sexp_make_fixnum(max_freed); +} + +#if SEXP_USE_GLOBAL_SYMBOLS +void sexp_mark_global_symbols(sexp ctx) { + int i; + for (i=0; isize = size; + h->max_size = max_size; + h->data = (char*) sexp_heap_align(sizeof(h->data)+(sexp_uint_t)&(h->data)); + free = h->free_list = (sexp_free_list) h->data; + h->next = NULL; + next = (sexp_free_list) (((char*)free)+sexp_heap_align(sexp_free_chunk_size)); + free->size = 0; /* actually sexp_heap_align(sexp_free_chunk_size) */ + free->next = next; + next->size = size - sexp_heap_align(sexp_free_chunk_size); + next->next = NULL; +#if SEXP_USE_DEBUG_GC + fprintf(stderr, SEXP_BANNER("heap: %p-%p data: %p-%p"), + h, ((char*)h)+sexp_heap_pad_size(size), h->data, h->data + size); + fprintf(stderr, SEXP_BANNER("first: %p end: %p"), + sexp_heap_first_block(h), sexp_heap_end(h)); + fprintf(stderr, SEXP_BANNER("free1: %p-%p free2: %p-%p"), + free, ((char*)free)+free->size, next, ((char*)next)+next->size); +#endif + return h; +} + +int sexp_grow_heap (sexp ctx, size_t size) { + size_t cur_size, new_size; + sexp_heap h = sexp_heap_last(sexp_context_heap(ctx)); + cur_size = h->size; + new_size = sexp_heap_align(((cur_size > size) ? cur_size : size) * 2); + h->next = sexp_make_heap(new_size, h->max_size); + return (h->next != NULL); +} + +void* sexp_try_alloc (sexp ctx, size_t size) { + sexp_free_list ls1, ls2, ls3; + sexp_heap h; + for (h=sexp_context_heap(ctx); h; h=h->next) + for (ls1=h->free_list, ls2=ls1->next; ls2; ls1=ls2, ls2=ls2->next) + if (ls2->size >= size) { +#if SEXP_USE_DEBUG_GC + ls3 = (sexp_free_list) sexp_heap_end(h); + if (ls2 >= ls3) + fprintf(stderr, "alloced %lu bytes past end of heap: %p (%lu) >= %p" + " next: %p (%lu)\n", size, ls2, ls2->size, ls3, ls2->next, + (ls2->next ? ls2->next->size : 0)); +#endif + if (ls2->size >= (size + SEXP_MINIMUM_OBJECT_SIZE)) { + ls3 = (sexp_free_list) (((char*)ls2)+size); /* the tail after ls2 */ + ls3->size = ls2->size - size; + ls3->next = ls2->next; + ls1->next = ls3; + } else { /* take the whole chunk */ + ls1->next = ls2->next; + } + memset((void*)ls2, 0, size); + return ls2; + } + return NULL; +} + +void* sexp_alloc (sexp ctx, size_t size) { + void *res; + size_t max_freed, sum_freed, total_size; + sexp_heap h = sexp_context_heap(ctx); + size = sexp_heap_align(size); + res = sexp_try_alloc(ctx, size); + if (! res) { + max_freed = sexp_unbox_fixnum(sexp_gc(ctx, &sum_freed)); + total_size = sexp_heap_total_size(sexp_context_heap(ctx)); + if (((max_freed < size) + || ((total_size > sum_freed) + && (total_size - sum_freed) > (total_size*SEXP_GROW_HEAP_RATIO))) + && ((!h->max_size) || (total_size < h->max_size))) + sexp_grow_heap(ctx, size); + res = sexp_try_alloc(ctx, size); + if (! res) + res = sexp_global(ctx, SEXP_G_OOM_ERROR); + } + return res; +} + +#if ! SEXP_USE_GLOBAL_HEAP + +void sexp_offset_heap_pointers (sexp_heap heap, sexp_heap from_heap, sexp* types, sexp flags) { + sexp_sint_t i, off, len, freep, loadp; + sexp_free_list q; + sexp p, t, end, *v; +#if SEXP_USE_DL + sexp name; +#endif + freep = sexp_unbox_fixnum(flags) & sexp_unbox_fixnum(SEXP_COPY_FREEP); + loadp = sexp_unbox_fixnum(flags) & sexp_unbox_fixnum(SEXP_COPY_LOADP); + + off = (sexp_sint_t)((sexp_sint_t)heap - (sexp_sint_t)from_heap); + heap->data += off; + end = (sexp) (heap->data + heap->size); + + /* adjust the free list */ + heap->free_list = (sexp_free_list) ((char*)heap->free_list + off); + for (q=heap->free_list; q->next; q=q->next) + q->next = (sexp_free_list) ((char*)q->next + off); + + /* adjust data by traversing over the new heap */ + p = (sexp) (heap->data + sexp_heap_align(sexp_free_chunk_size)); + q = heap->free_list; + while (p < end) { + /* find the next free list pointer */ + for ( ; q && ((char*)q < (char*)p); q=q->next) + ; + if ((char*)q == (char*)p) { /* this is a free block, skip it */ + p = (sexp) (((char*)p) + q->size); + } else { + t = (sexp)((char*)(types[sexp_pointer_tag(p)]) + + ((char*)types > (char*)p ? off : 0)); + len = sexp_type_num_slots_of_object(t, p); + v = (sexp*) ((char*)p + sexp_type_field_base(t)); + /* offset any pointers in the _destination_ heap */ + for (i=0; idata + sexp_heap_align(sexp_free_chunk_size)); + q = heap->free_list; + while (p < end) { + /* find the next free list pointer */ + for ( ; q && ((char*)q < (char*)p); q=q->next) + ; + if ((char*)q == (char*)p) { /* this is a free block, skip it */ + p = (sexp) (((char*)p) + q->size); + } else { +#if SEXP_USE_DL + if (sexp_opcodep(p) && sexp_opcode_func(p)) { + name = (sexp_opcode_data2(p) && sexp_stringp(sexp_opcode_data2(p))) ? sexp_opcode_data2(p) : sexp_opcode_name(p); + if (sexp_dlp(sexp_opcode_dl(p))) { + if (!sexp_dl_handle(sexp_opcode_dl(p))) + sexp_dl_handle(sexp_opcode_dl(p)) = dlopen(sexp_string_data(sexp_dl_file(sexp_opcode_dl(p))), RTLD_LAZY); + sexp_opcode_func(p) = dlsym(sexp_dl_handle(sexp_opcode_dl(p)), sexp_string_data(name)); + } else { + sexp_opcode_func(p) = dlsym(SEXP_RTLD_DEFAULT, sexp_string_data(name)); + } + } else +#endif + if (sexp_typep(p)) { + if (sexp_type_finalize(p)) { + /* TODO: handle arbitrary finalizers in images */ +#if SEXP_USE_DL + if (sexp_type_tag(p) == SEXP_DL) + sexp_type_finalize(p) = SEXP_FINALIZE_DL; + else +#endif + sexp_type_finalize(p) = SEXP_FINALIZE_PORT; + } + } + t = types[sexp_pointer_tag(p)]; + p = (sexp) (((char*)p)+sexp_heap_align(sexp_type_size_of_object(t, p))); + } + } + } +} + +sexp sexp_copy_context (sexp ctx, sexp dst, sexp flags) { + sexp_sint_t off; + sexp_heap to, from = sexp_context_heap(ctx); + + /* validate input, creating a new heap if needed */ + if (from->next) { + return sexp_user_exception(ctx, NULL, "can't copy a non-contiguous heap", ctx); + } else if (! dst || sexp_not(dst)) { + to = sexp_make_heap(from->size, from->max_size); + if (!to) return sexp_global(ctx, SEXP_G_OOM_ERROR); + dst = (sexp) ((char*)ctx + ((char*)to - (char*)from)); + } else if (! sexp_contextp(dst)) { + return sexp_type_exception(ctx, NULL, SEXP_CONTEXT, dst); + } else if (sexp_context_heap(dst)->size < from->size) { + return sexp_user_exception(ctx, NULL, "destination context too small", dst); + } else { + to = sexp_context_heap(dst); + } + + /* copy the raw data */ + off = (char*)to - (char*)from; + memcpy(to, from, sexp_heap_pad_size(from->size)); + + /* adjust the pointers */ + sexp_offset_heap_pointers(to, from, sexp_context_types(ctx) + off, flags); + + return dst; +} + +#endif + +void sexp_gc_init (void) { +#if SEXP_USE_GLOBAL_HEAP || SEXP_USE_CONSERVATIVE_GC + sexp_uint_t size = sexp_heap_align(SEXP_INITIAL_HEAP_SIZE); +#endif +#if SEXP_USE_GLOBAL_HEAP + sexp_global_heap = sexp_make_heap(size, SEXP_MAXIMUM_HEAP_SIZE); +#endif +#if SEXP_USE_CONSERVATIVE_GC + /* the +32 is a hack, but this is just for debugging anyway */ + stack_base = ((sexp*)&size) + 32; +#endif +} diff --git a/include/chibi/bignum.h b/include/chibi/bignum.h new file mode 100644 index 00000000..2c44f503 --- /dev/null +++ b/include/chibi/bignum.h @@ -0,0 +1,68 @@ +/* bignum.h -- header for bignum utilities */ +/* Copyright (c) 2009-2011 Alex Shinn. All rights reserved. */ +/* BSD-style license: http://synthcode.com/license.txt */ + +#ifndef SEXP_BIGNUM_H +#define SEXP_BIGNUM_H + +#if (SEXP_64_BIT) && defined(__GNUC__) +typedef unsigned int uint128_t __attribute__((mode(TI))); +typedef int sint128_t __attribute__((mode(TI))); +typedef uint128_t sexp_luint_t; +typedef sint128_t sexp_lsint_t; +#else +typedef unsigned long long sexp_luint_t; +typedef long long sexp_lsint_t; +#endif + +sexp_sint_t sexp_bignum_compare (sexp a, sexp b); +sexp sexp_compare (sexp ctx, sexp a, sexp b); +sexp sexp_make_bignum (sexp ctx, sexp_uint_t len); +sexp sexp_copy_bignum (sexp ctx, sexp dst, sexp a, sexp_uint_t len); +sexp sexp_bignum_normalize (sexp a); +sexp_uint_t sexp_bignum_hi (sexp a); +sexp sexp_fixnum_to_bignum (sexp ctx, sexp a); +double sexp_bignum_to_double (sexp a); +sexp sexp_double_to_bignum (sexp ctx, double f); +sexp sexp_bignum_fxadd (sexp ctx, sexp a, sexp_uint_t b); +sexp sexp_bignum_fxmul (sexp ctx, sexp d, sexp a, sexp_uint_t b, int offset); +sexp_uint_t sexp_bignum_fxdiv (sexp ctx, sexp a, sexp_uint_t b, int offset); +sexp sexp_bignum_add (sexp ctx, sexp dst, sexp a, sexp b); +sexp sexp_bignum_sub (sexp ctx, sexp dst, sexp a, sexp b); +sexp sexp_bignum_mul (sexp ctx, sexp dst, sexp a, sexp b); +sexp sexp_bignum_div (sexp ctx, sexp dst, sexp a, sexp b); +sexp sexp_bignum_expt (sexp ctx, sexp n, sexp e); +sexp sexp_add (sexp ctx, sexp a, sexp b); +sexp sexp_sub (sexp ctx, sexp a, sexp b); +sexp sexp_mul (sexp ctx, sexp a, sexp b); +sexp sexp_div (sexp ctx, sexp a, sexp b); +sexp sexp_quotient (sexp ctx, sexp a, sexp b); +sexp sexp_remainder (sexp ctx, sexp a, sexp b); +#if SEXP_USE_RATIOS +sexp sexp_double_to_ratio (sexp ctx, double f); +double sexp_ratio_to_double (sexp rat); +sexp sexp_make_ratio (sexp ctx, sexp num, sexp den); +sexp sexp_ratio_normalize (sexp ctx, sexp rat, sexp in); +sexp sexp_ratio_round (sexp ctx, sexp a); +sexp sexp_ratio_trunc (sexp ctx, sexp a); +sexp sexp_ratio_floor (sexp ctx, sexp a); +sexp sexp_ratio_ceiling (sexp ctx, sexp a); +#endif +#if SEXP_USE_COMPLEX +sexp sexp_make_complex (sexp ctx, sexp real, sexp image); +sexp sexp_complex_normalize (sexp real); +sexp sexp_complex_math_error (sexp ctx, sexp z); +sexp sexp_complex_sqrt (sexp ctx, sexp z); +sexp sexp_complex_exp (sexp ctx, sexp z); +sexp sexp_complex_expt (sexp ctx, sexp a, sexp b); +sexp sexp_complex_log (sexp ctx, sexp z); +sexp sexp_complex_sin (sexp ctx, sexp z); +sexp sexp_complex_cos (sexp ctx, sexp z); +sexp sexp_complex_tan (sexp ctx, sexp z); +sexp sexp_complex_asin (sexp ctx, sexp z); +sexp sexp_complex_acos (sexp ctx, sexp z); +sexp sexp_complex_atan (sexp ctx, sexp z); +#endif + +#endif /* ! SEXP_BIGNUM_H */ + diff --git a/include/chibi/eval.h b/include/chibi/eval.h new file mode 100644 index 00000000..c643a1cf --- /dev/null +++ b/include/chibi/eval.h @@ -0,0 +1,155 @@ +/* eval.h -- headers for eval library */ +/* Copyright (c) 2009-2011 Alex Shinn. All rights reserved. */ +/* BSD-style license: http://synthcode.com/license.txt */ + +#ifndef SEXP_EVAL_H +#define SEXP_EVAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "chibi/sexp.h" + +/************************* additional types ***************************/ + +#define sexp_init_file "init-" +#define sexp_init_file_suffix ".scm" +#define sexp_meta_file "meta.scm" +#define sexp_leap_seconds_file "leap.txt" + +enum sexp_core_form_names { + SEXP_CORE_DEFINE = 1, + SEXP_CORE_SET, + SEXP_CORE_LAMBDA, + SEXP_CORE_IF, + SEXP_CORE_BEGIN, + SEXP_CORE_QUOTE, + SEXP_CORE_SYNTAX_QUOTE, + SEXP_CORE_DEFINE_SYNTAX, + SEXP_CORE_LET_SYNTAX, + SEXP_CORE_LETREC_SYNTAX +}; + +enum sexp_opcode_classes { + SEXP_OPC_GENERIC = 1, + SEXP_OPC_TYPE_PREDICATE, + SEXP_OPC_PREDICATE, + SEXP_OPC_ARITHMETIC, + SEXP_OPC_ARITHMETIC_CMP, + SEXP_OPC_IO, + SEXP_OPC_CONSTRUCTOR, + SEXP_OPC_GETTER, + SEXP_OPC_SETTER, + SEXP_OPC_PARAMETER, + SEXP_OPC_FOREIGN, + SEXP_OPC_NUM_OP_CLASSES +}; + +/**************************** prototypes ******************************/ + +SEXP_API void sexp_scheme_init (void); +SEXP_API sexp sexp_make_eval_context (sexp context, sexp stack, sexp env, sexp_uint_t size, sexp_uint_t max_size); +SEXP_API sexp sexp_make_child_context (sexp context, sexp lambda); +SEXP_API sexp sexp_compile_error (sexp ctx, const char *message, sexp obj); +SEXP_API sexp sexp_analyze (sexp context, sexp x); +SEXP_API void sexp_stack_trace (sexp ctx, sexp out); +SEXP_API sexp sexp_free_vars (sexp context, sexp x, sexp fv); +SEXP_API int sexp_param_index (sexp lambda, sexp name); +SEXP_API sexp sexp_compile_op (sexp context, sexp self, sexp_sint_t n, sexp obj, sexp env); +SEXP_API sexp sexp_eval_op (sexp context, sexp self, sexp_sint_t n, sexp obj, sexp env); +SEXP_API sexp sexp_eval_string (sexp context, const char *str, sexp_sint_t len, sexp env); +SEXP_API sexp sexp_load_op (sexp context, sexp self, sexp_sint_t n, sexp expr, sexp env); +SEXP_API sexp sexp_make_env_op (sexp context, sexp self, sexp_sint_t n); +SEXP_API sexp sexp_make_null_env_op (sexp context, sexp self, sexp_sint_t n, sexp version); +SEXP_API sexp sexp_make_primitive_env (sexp context, sexp version); +SEXP_API sexp sexp_make_standard_env_op (sexp context, sexp self, sexp_sint_t n, sexp version); +SEXP_API void sexp_set_parameter (sexp ctx, sexp env, sexp name, sexp value); +SEXP_API sexp sexp_load_standard_ports (sexp context, sexp env, FILE* in, FILE* out, FILE* err, int no_close); +SEXP_API sexp sexp_load_standard_env (sexp context, sexp env, sexp version); +SEXP_API sexp sexp_find_module_file (sexp ctx, const char *file); +SEXP_API sexp sexp_load_module_file (sexp ctx, const char *file, sexp env); +SEXP_API sexp sexp_add_module_directory_op (sexp ctx, sexp self, sexp_sint_t n, sexp dir, sexp appendp); +SEXP_API sexp sexp_meta_environment (sexp ctx, sexp self, sexp_sint_t n); +SEXP_API sexp sexp_extend_env (sexp ctx, sexp env, sexp vars, sexp value); +SEXP_API sexp sexp_env_import_op (sexp ctx, sexp self, sexp_sint_t n, sexp to, sexp from, sexp ls, sexp immutp); +SEXP_API sexp sexp_identifier_op(sexp ctx, sexp self, sexp_sint_t n, sexp x); +SEXP_API sexp sexp_syntactic_closure_expr(sexp ctx, sexp self, sexp_sint_t n, sexp x); +SEXP_API sexp sexp_identifier_eq_op(sexp ctx, sexp self, sexp_sint_t n, sexp a, sexp b, sexp c, sexp d); +SEXP_API sexp sexp_open_input_file_op(sexp ctx, sexp self, sexp_sint_t n, sexp x); +SEXP_API sexp sexp_open_output_file_op(sexp ctx, sexp self, sexp_sint_t n, sexp x); +SEXP_API sexp sexp_close_port_op(sexp ctx, sexp self, sexp_sint_t n, sexp x); +SEXP_API sexp sexp_env_define (sexp ctx, sexp env, sexp sym, sexp val); +SEXP_API sexp sexp_env_cell (sexp env, sexp sym, int localp); +SEXP_API sexp sexp_env_ref (sexp env, sexp sym, sexp dflt); +SEXP_API sexp sexp_parameter_ref (sexp ctx, sexp param); +SEXP_API sexp sexp_warn_undefs_op (sexp ctx, sexp self, sexp_sint_t n, sexp from, sexp to, sexp res); +SEXP_API sexp sexp_make_lit (sexp ctx, sexp value); +SEXP_API sexp sexp_make_opcode (sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp_proc1); +SEXP_API sexp sexp_make_procedure_op (sexp ctx, sexp self, sexp_sint_t n, sexp flags, sexp num_args, sexp bc, sexp vars); +SEXP_API sexp sexp_define_foreign_aux (sexp ctx, sexp env, const char *name, int num_args, int flags, sexp_proc1 f, sexp data); +#if SEXP_USE_GREEN_THREADS +SEXP_API sexp sexp_dk (sexp ctx, sexp self, sexp_sint_t n, sexp val); +SEXP_API sexp sexp_thread_parameters (sexp ctx, sexp self, sexp_sint_t n); +SEXP_API sexp sexp_thread_parameters_set (sexp ctx, sexp self, sexp_sint_t n, sexp val); +#endif +#if SEXP_USE_UTF8_STRINGS +SEXP_API int sexp_utf8_initial_byte_count (int c); +SEXP_API int sexp_utf8_char_byte_count (int c); +SEXP_API int sexp_string_utf8_length (unsigned char *p, int len); +SEXP_API char* sexp_string_utf8_prev (unsigned char *p); +SEXP_API sexp sexp_string_utf8_ref (sexp ctx, sexp str, sexp i); +#endif + +#if SEXP_USE_NATIVE_X86 +SEXP_API sexp sexp_write_char_op(sexp ctx, sexp self, sexp_sint_t n, sexp ch, sexp out); +SEXP_API sexp sexp_newline_op(sexp ctx, sexp self, sexp_sint_t n, sexp out); +SEXP_API sexp sexp_read_char_op(sexp ctx, sexp self, sexp_sint_t n, sexp in); +SEXP_API sexp sexp_peek_char_op(sexp ctx, sexp self, sexp_sint_t n, sexp in); +SEXP_API sexp sexp_exact_to_inexact(sexp ctx, sexp self, sexp_sint_t n, sexp i); +SEXP_API sexp sexp_inexact_to_exact(sexp ctx, sexp self, sexp_sint_t n, sexp x); +SEXP_API sexp sexp_char_upcase(sexp ctx, sexp self, sexp_sint_t n, sexp ch); +SEXP_API sexp sexp_char_downcase(sexp ctx, sexp self, sexp_sint_t n, sexp ch); +#endif + +#define sexp_define_foreign(c,e,s,n,f) sexp_define_foreign_aux(c,e,s,n,0,(sexp_proc1)f,NULL) +#define sexp_define_foreign_opt(c,e,s,n,f,d) sexp_define_foreign_aux(c,e,s,n,1,(sexp_proc1)f,d) + +SEXP_API sexp sexp_define_foreign_param (sexp ctx, sexp env, const char *name, int num_args, sexp_proc1 f, const char *param); + +#define sexp_env_key(x) sexp_car(x) +#define sexp_env_value(x) sexp_cdr(x) +#define sexp_env_next_cell(x) sexp_pair_source(x) +#define sexp_env_push(ctx, env, tmp, name, value) (tmp=sexp_cons(ctx,name,value), sexp_env_next_cell(tmp)=sexp_env_bindings(env), sexp_env_bindings(env)=tmp) +#define sexp_env_push_rename(ctx, env, tmp, name, value) (tmp=sexp_cons(ctx,name,value), sexp_env_next_cell(tmp)=sexp_env_renames(env), sexp_env_renames(env)=tmp) + +#if SEXP_USE_TYPE_DEFS +SEXP_API sexp sexp_make_type_predicate_op (sexp ctx, sexp self, sexp_sint_t n, sexp name, sexp type); +SEXP_API sexp sexp_make_constructor_op (sexp ctx, sexp self, sexp_sint_t n, sexp name, sexp type); +SEXP_API sexp sexp_make_getter_op (sexp ctx, sexp self, sexp_sint_t n, sexp name, sexp type, sexp index); +SEXP_API sexp sexp_make_setter_op (sexp ctx, sexp self, sexp_sint_t n, sexp name, sexp type, sexp index); +#endif + +/* simplify primitive API interface */ +#define sexp_make_synclo(ctx, a, b, c) sexp_make_synclo_op(ctx, NULL, 3, a, b, c) +#define sexp_make_procedure(ctx, f, n, b, v) sexp_make_procedure_op(ctx, NULL, 4, f, n, b, v) +#define sexp_make_env(ctx) sexp_make_env_op(ctx, NULL, 0) +#define sexp_make_null_env(ctx, v) sexp_make_null_env_op(ctx, NULL, 0, v) +#define sexp_make_standard_env(ctx) sexp_make_standard_env_op(ctx, NULL, 0) +#define sexp_add_module_directory(ctx, d, a) sexp_add_module_directory_op(ctx, NULL, 1, d, a) +#define sexp_eval(ctx, x, e) sexp_eval_op(ctx, NULL, 2, x, e) +#define sexp_load(ctx, f, e) sexp_load_op(ctx, NULL, 2, f, e) +#define sexp_env_import(ctx, a, b, c, d) sexp_env_import_op(ctx, NULL, 4, a, b, c, d) +#define sexp_identifierp(ctx, x) sexp_identifierp_op(ctx, NULL, 1, x) +#define sexp_identifier_to_symbol(ctx, x) sexp_syntactic_closure_expr(ctx, NULL, 1, x) +#define sexp_identifier_eq(ctx, a, b, c, d) sexp_identifier_eq_op(ctx, NULL, 4, a, b, c, d) +#define sexp_open_input_file(ctx, x) sexp_open_input_file_op(ctx, NULL, 1, x) +#define sexp_open_output_file(ctx, x) sexp_open_output_file_op(ctx, NULL, 1, x) +#define sexp_close_port(ctx, x) sexp_close_port_op(ctx, NULL, 1, x) +#define sexp_warn_undefs(ctx, from, to, res) sexp_warn_undefs_op(ctx, NULL, 3, from, to, res) + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ! SEXP_EVAL_H */ diff --git a/include/chibi/features.h b/include/chibi/features.h new file mode 100644 index 00000000..7349a370 --- /dev/null +++ b/include/chibi/features.h @@ -0,0 +1,740 @@ +/* features.h -- general feature configuration */ +/* Copyright (c) 2009-2012 Alex Shinn. All rights reserved. */ +/* BSD-style license: http://synthcode.com/license.txt */ + +/* uncomment this to disable most features */ +/* Most features are enabled by default, but setting this */ +/* option will disable any not explicitly enabled. */ +/* #define SEXP_USE_NO_FEATURES 1 */ + +/* uncomment this to disable interpreter-based threads */ +/* #define SEXP_USE_GREEN_THREADS 0 */ + +/* uncomment this to enable the experimental native x86 backend */ +/* #define SEXP_USE_NATIVE_X86 1 */ + +/* uncomment this to disable the module system */ +/* Currently this just loads the meta.scm from main and */ +/* sets up an (import (module name)) macro. */ +/* #define SEXP_USE_MODULES 0 */ + +/* uncomment this to disable dynamic loading */ +/* If enabled, you can LOAD .so files with a */ +/* sexp_init_library(ctx, env) function provided. */ +/* #define SEXP_USE_DL 0 */ + +/* uncomment this to statically compile all C libs */ +/* If set, this will statically include the clibs.c file */ +/* into the standard environment, so that you can have */ +/* access to a predefined set of C libraries without */ +/* needing dynamic loading. The clibs.c file is generated */ +/* automatically by searching the lib directory for */ +/* modules with include-shared, but can be hand-tailored */ +/* to your needs. */ +/* #define SEXP_USE_STATIC_LIBS 1 */ + +/* uncomment this to disable a simplifying optimization pass */ +/* This performs some simple optimizations such as dead-code */ +/* elimination, constant-folding, and directly propagating */ +/* non-mutated let values bound to constants or non-mutated */ +/* references. More than performance, this is aimed at reducing the */ +/* size of the compiled code, especially as the result of macro */ +/* expansions, so it's a good idea to leave it enabled. */ +/* #define SEXP_USE_SIMPLIFY 0 */ + +/* uncomment this to disable dynamic type definitions */ +/* This enables register-simple-type and related */ +/* opcodes for defining types, needed by the default */ +/* implementation of (srfi 9). */ +/* #define SEXP_USE_TYPE_DEFS 0 */ + +/* uncomment this to use the Boehm conservative GC */ +/* Conservative GCs make it easier to write extensions, */ +/* since you don't have to keep track of intermediate */ +/* variables, but can leak memory. Boehm is also a */ +/* very large library to link in. You may want to */ +/* enable this when debugging your own extensions, or */ +/* if you suspect a bug in the native GC. */ +/* #define SEXP_USE_BOEHM 1 */ + +/* uncomment this to disable weak references */ +/* #define SEXP_USE_WEAK_REFERENCES 0 */ + +/* uncomment this to just malloc manually instead of any GC */ +/* Mostly for debugging purposes, this is the no GC option. */ +/* You can use just the read/write API and */ +/* explicitly free sexps, though. */ +/* #define SEXP_USE_MALLOC 1 */ + +/* uncomment this to allocate heaps with mmap instead of malloc */ +/* #define SEXP_USE_MMAP_GC 1 */ + +/* uncomment this to add conservative checks to the native GC */ +/* Please mail the author if enabling this makes a bug */ +/* go away and you're not working on your own C extension. */ +/* #define SEXP_USE_CONSERVATIVE_GC 1 */ + +/* uncomment this to add additional native checks to only mark objects in the heap */ +/* #define SEXP_USE_SAFE_GC_MARK 1 */ + +/* uncomment this to track what C source line each object is allocated from */ +/* #define SEXP_USE_TRACK_ALLOC_SOURCE 1 */ + +/* uncomment this to add additional native gc checks to verify a magic header */ +/* #define SEXP_USE_HEADER_MAGIC 1 */ + +/* uncomment this to add very verbose debugging stats to the native GC */ +/* #define SEXP_USE_DEBUG_GC 1 */ + +/* uncomment this to enable "safe" field accessors for primitive types */ +/* The sexp union type fields are abstracted away with macros of the */ +/* form sexp__(), however these are just convenience */ +/* macros equivalent to directly accessing the union field, and will */ +/* return incorrect results (or segfault) if isn't of the correct */ +/* . Thus you're required to check the types manually before */ +/* accessing them. However, to detect errors earlier you can enable */ +/* SEXP_USE_SAFE_ACCESSORS, and on invalid accesses chibi will print */ +/* a friendly error message and immediately segfault itself so you */ +/* can see where the invalid access was made. */ +/* Note this is only intended for debugging, and mostly for user code. */ +/* If you want to build chibi itself with this option, compilation */ +/* may be very slow and using CFLAGS=-O0 is recommended. */ +/* #define SEXP_USE_SAFE_ACCESSORS 1 */ + +/* uncomment this to make the heap common to all contexts */ +/* By default separate contexts can have separate heaps, */ +/* and are thus thread-safe and independant. */ +/* #define SEXP_USE_GLOBAL_HEAP 1 */ + +/* uncomment this to make the symbol table common to all contexts */ +/* Will still be restricted to all contexts sharing the same */ +/* heap, of course. */ +/* #define SEXP_USE_GLOBAL_SYMBOLS 1 */ + +/* uncomment this to disable foreign function bindings with > 6 args */ +/* #define SEXP_USE_EXTENDED_FCALL 0 */ + +/* uncomment this if you don't need flonum support */ +/* This is only for EVAL - you'll still be able to read */ +/* and write flonums directly through the sexp API. */ +/* #define SEXP_USE_FLONUMS 0 */ + +/* uncomment this to disable reading/writing IEEE infinities */ +/* By default you can read/write +inf.0, -inf.0 and +nan.0 */ +/* #define SEXP_USE_INFINITIES 0 */ + +/* uncomment this if you want immediate flonums */ +/* This is experimental, enable at your own risk. */ +/* #define SEXP_USE_IMMEDIATE_FLONUMS 1 */ + +/* uncomment this if you don't want bignum support */ +/* Bignums are implemented with a small, custom library */ +/* in opt/bignum.c. */ +/* #define SEXP_USE_BIGNUMS 0 */ + +/* uncomment this if you don't want exact ratio support */ +/* Ratios are part of the bignum library and imply bignums. */ +/* #define SEXP_USE_RATIOS 0 */ + +/* uncomment this if you don't want imaginary number support */ +/* #define SEXP_USE_COMPLEX 0 */ + +/* uncomment this if you don't want 1## style approximate digits */ +/* #define SEXP_USE_PLACEHOLDER_DIGITS 0 */ + +/* uncomment this if you don't need extended math operations */ +/* This includes the trigonometric and expt functions. */ +/* Automatically disabled if you've disabled flonums. */ +/* #define SEXP_USE_MATH 0 */ + +/* uncomment this to disable warning about references to undefined variables */ +/* This is something of a hack, but can be quite useful. */ +/* It's very fast and doesn't involve any separate analysis */ +/* passes. */ +/* #define SEXP_USE_WARN_UNDEFS 0 */ + +/* uncomment this to disable huffman-coded immediate symbols */ +/* By default (this may change) small symbols are represented */ +/* as immediates using a simple huffman encoding. This keeps */ +/* the symbol table small, and minimizes hashing when doing a */ +/* lot of reading. */ +/* #define SEXP_USE_HUFF_SYMS 0 */ + +/* uncomment this to just use a single list for hash tables */ +/* You can trade off some space in exchange for longer read */ +/* times by disabling hashing and just putting all */ +/* non-immediate symbols in a single list. */ +/* #define SEXP_USE_HASH_SYMS 0 */ + +/* uncomment this to disable extended char names as defined in R7RS */ +/* #define SEXP_USE_EXTENDED_CHAR_NAMES 0 */ + +/* uncomment this to disable UTF-8 string support */ +/* The default settings store strings in memory as UTF-8, */ +/* and assumes strings passed to/from the C FFI are UTF-8. */ +/* #define SEXP_USE_UTF8_STRINGS 0 */ + +/* uncomment this to disable the string-set! opcode */ +/* By default (non-literal) strings are mutable. */ +/* Making them immutable allows for packed UTF-8 strings. */ +/* #define SEXP_USE_MUTABLE_STRINGS 0 */ + +/* uncomment this to disable string ports */ +/* If disabled some basic functionality such as number->string */ +/* will not be available by default. */ +/* #define SEXP_USE_STRING_STREAMS 0 */ + +/* uncomment this to disable automatic closing of ports */ +/* If enabled, the underlying FILE* for file ports will be */ +/* automatically closed when they're garbage collected. Doesn't */ +/* apply to stdin/stdout/stderr. */ +/* #define SEXP_USE_AUTOCLOSE_PORTS 0 */ + +/* uncomment this to use the normal 1970 unix epoch */ +/* By default chibi uses an datetime epoch starting at */ +/* 2010/01/01 00:00:00 in order to be able to represent */ +/* more common times as fixnums. */ +/* #define SEXP_USE_2010_EPOCH 0 */ + +/* uncomment this to disable stack overflow checks */ +/* By default stacks are fairly small, so it's good to leave */ +/* this enabled. */ +/* #define SEXP_USE_CHECK_STACK 0 */ + +/* uncomment this to disable growing the stack on overflow */ +/* If enabled, chibi attempts to grow the stack on overflow, */ +/* up to SEXP_MAX_STACK_SIZE, otherwise a failed stack check */ +/* will just raise an error immediately. */ +/* #define SEXP_USE_GROW_STACK 0 */ + +/* #define SEXP_USE_DEBUG_VM 0 */ +/* Experts only. */ +/* For *very* verbose output on every VM operation. */ + +/* uncomment this to make the VM adhere to alignment rules */ +/* This is required on some platforms, e.g. ARM */ +/* #define SEXP_USE_ALIGNED_BYTECODE */ + +/************************************************************************/ +/* These settings are configurable but only recommended for */ +/* experienced users, and only apply when using the native GC. */ +/************************************************************************/ + +/* the initial heap size in bytes */ +#ifndef SEXP_INITIAL_HEAP_SIZE +#define SEXP_INITIAL_HEAP_SIZE (2*1024*1024) +#endif + +/* the maximum heap size in bytes - if 0 there is no limit */ +#ifndef SEXP_MAXIMUM_HEAP_SIZE +#define SEXP_MAXIMUM_HEAP_SIZE 0 +#endif +#ifndef SEXP_MINIMUM_HEAP_SIZE +#define SEXP_MINIMUM_HEAP_SIZE 8*1024 +#endif + +/* if after GC more than this percentage of memory is still in use, */ +/* and we've not exceeded the maximum size, grow the heap */ +#ifndef SEXP_GROW_HEAP_RATIO +#define SEXP_GROW_HEAP_RATIO 0.75 +#endif + +/* the default number of opcodes to run each thread for */ +#ifndef SEXP_DEFAULT_QUANTUM +#define SEXP_DEFAULT_QUANTUM 500 +#endif + +/************************************************************************/ +/* DEFAULTS - DO NOT MODIFY ANYTHING BELOW THIS LINE */ +/************************************************************************/ + +#ifndef SEXP_64_BIT +#if defined(__amd64) || defined(__x86_64) || defined(_WIN64) || defined(_Wp64) +#define SEXP_64_BIT 1 +#else +#define SEXP_64_BIT 0 +#endif +#endif + +#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) +#define SEXP_BSD 1 +#else +#define SEXP_BSD 0 +#if ! defined(_GNU_SOURCE) && ! defined(_WIN32) && ! defined(PLAN9) +#define _GNU_SOURCE +#endif +#endif + +#ifndef SEXP_USE_NO_FEATURES +#define SEXP_USE_NO_FEATURES 0 +#endif + +#ifndef SEXP_USE_PEDANTIC +#define SEXP_USE_PEDANTIC 0 +#endif + +#ifndef SEXP_USE_GREEN_THREADS +#define SEXP_USE_GREEN_THREADS ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_AUTO_FORCE +#define SEXP_USE_AUTO_FORCE 0 +#endif + +#ifndef SEXP_USE_NATIVE_X86 +#define SEXP_USE_NATIVE_X86 0 +#endif + +#ifndef SEXP_USE_MODULES +#define SEXP_USE_MODULES ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_TYPE_DEFS +#define SEXP_USE_TYPE_DEFS ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_MAXIMUM_TYPES +#define SEXP_MAXIMUM_TYPES ((sexp_tag_t)-1) +#endif + +#ifndef SEXP_USE_DL +#if defined(PLAN9) || defined(_WIN32) +#define SEXP_USE_DL 0 +#else +#define SEXP_USE_DL ! SEXP_USE_NO_FEATURES +#endif +#endif + +#ifndef SEXP_USE_STATIC_LIBS +#define SEXP_USE_STATIC_LIBS 0 +#endif + +#ifndef SEXP_USE_SIMPLIFY +#define SEXP_USE_SIMPLIFY ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_BOEHM +#define SEXP_USE_BOEHM 0 +#endif + +#ifndef SEXP_USE_WEAK_REFERENCES +#define SEXP_USE_WEAK_REFERENCES ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_MALLOC +#define SEXP_USE_MALLOC 0 +#endif + +#ifndef SEXP_USE_LIMITED_MALLOC +#define SEXP_USE_LIMITED_MALLOC 0 +#endif + +#ifndef SEXP_USE_MMAP_GC +#define SEXP_USE_MMAP_GC 0 +#endif + +#ifndef SEXP_USE_DEBUG_GC +#define SEXP_USE_DEBUG_GC 0 +#endif + +#ifndef SEXP_USE_SAFE_GC_MARK +#define SEXP_USE_SAFE_GC_MARK SEXP_USE_DEBUG_GC > 1 +#endif + +#ifndef SEXP_USE_CONSERVATIVE_GC +#define SEXP_USE_CONSERVATIVE_GC 0 +#endif + +#ifndef SEXP_USE_TRACK_ALLOC_SOURCE +#define SEXP_USE_TRACK_ALLOC_SOURCE SEXP_USE_DEBUG_GC > 2 +#endif + +#ifndef SEXP_USE_HEADER_MAGIC +#define SEXP_USE_HEADER_MAGIC 0 +#endif + +#ifndef SEXP_USE_SAFE_ACCESSORS +#define SEXP_USE_SAFE_ACCESSORS 0 +#endif + +#ifndef SEXP_USE_GLOBAL_HEAP +#if SEXP_USE_BOEHM || SEXP_USE_MALLOC +#define SEXP_USE_GLOBAL_HEAP 1 +#else +#define SEXP_USE_GLOBAL_HEAP 0 +#endif +#endif + +#ifndef SEXP_USE_GLOBAL_SYMBOLS +#if SEXP_USE_BOEHM || SEXP_USE_MALLOC +#define SEXP_USE_GLOBAL_SYMBOLS 1 +#else +#define SEXP_USE_GLOBAL_SYMBOLS 0 +#endif +#endif + +#ifndef SEXP_USE_STRICT_TOPLEVEL_BINDINGS +#define SEXP_USE_STRICT_TOPLEVEL_BINDINGS 0 +#endif + +#if SEXP_USE_STRICT_TOPLEVEL_BINDINGS +#define SEXP_USE_RENAME_BINDINGS 1 +#else +#ifndef SEXP_USE_RENAME_BINDINGS +#define SEXP_USE_RENAME_BINDINGS 0 +#endif +#endif + +#ifndef SEXP_USE_EXTENDED_FCALL +#define SEXP_USE_EXTENDED_FCALL (!SEXP_USE_NO_FEATURES) +#endif + +#ifndef SEXP_USE_FLONUMS +#define SEXP_USE_FLONUMS (!SEXP_USE_NO_FEATURES) +#endif + +#ifndef SEXP_USE_BIGNUMS +#define SEXP_USE_BIGNUMS (!SEXP_USE_NO_FEATURES) +#endif + +#ifndef SEXP_USE_RATIOS +#define SEXP_USE_RATIOS SEXP_USE_FLONUMS +#endif + +#ifndef SEXP_USE_COMPLEX +#define SEXP_USE_COMPLEX SEXP_USE_FLONUMS +#endif + +#if (SEXP_USE_RATIOS || SEXP_USE_COMPLEX) +#undef SEXP_USE_BIGNUMS +#define SEXP_USE_BIGNUMS 1 +#undef SEXP_USE_FLONUMS +#define SEXP_USE_FLONUMS 1 +#endif + +#ifndef SEXP_USE_INFINITIES +#if defined(PLAN9) || ! SEXP_USE_FLONUMS +#define SEXP_USE_INFINITIES 0 +#else +#define SEXP_USE_INFINITIES ! SEXP_USE_NO_FEATURES +#endif +#endif + +#ifndef SEXP_USE_IMMEDIATE_FLONUMS +#define SEXP_USE_IMMEDIATE_FLONUMS 0 +#endif + +#ifndef SEXP_USE_PLACEHOLDER_DIGITS +#define SEXP_USE_PLACEHOLDER_DIGITS SEXP_USE_FLONUMS +#endif + +#ifndef SEXP_PLACEHOLDER_DIGIT +#define SEXP_PLACEHOLDER_DIGIT '#' +#endif + +#ifndef SEXP_USE_MATH +#define SEXP_USE_MATH SEXP_USE_FLONUMS && ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_ESCAPE_NEWLINE +#define SEXP_USE_ESCAPE_NEWLINE ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_ESCAPE_REQUIRES_TRAILING_SEMI_COLON +#define SEXP_USE_ESCAPE_REQUIRES_TRAILING_SEMI_COLON SEXP_USE_PEDANTIC +#endif + +#ifndef SEXP_USE_OBJECT_BRACE_LITERALS +#define SEXP_USE_OBJECT_BRACE_LITERALS (SEXP_USE_TYPE_DEFS && !SEXP_USE_NO_FEATURES) +#endif + +/* Dangerous without shared object detection. */ +#ifndef SEXP_USE_TYPE_PRINTERS +#define SEXP_USE_TYPE_PRINTERS 0 +#endif + +#ifndef SEXP_USE_BYTEVECTOR_LITERALS +#define SEXP_USE_BYTEVECTOR_LITERALS ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_SELF_PARAMETER +#define SEXP_USE_SELF_PARAMETER 1 +#endif + +#ifndef SEXP_USE_WARN_UNDEFS +#define SEXP_USE_WARN_UNDEFS ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_HUFF_SYMS +#define SEXP_USE_HUFF_SYMS ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_HASH_SYMS +#define SEXP_USE_HASH_SYMS ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_FOLD_CASE_SYMS +#define SEXP_USE_FOLD_CASE_SYMS ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_DEFAULT_FOLD_CASE_SYMS +#define SEXP_DEFAULT_FOLD_CASE_SYMS 0 +#endif + +/* experimental optimization to use jumps instead of the TAIL-CALL opcode */ +#ifndef SEXP_USE_TAIL_JUMPS +/* #define SEXP_USE_TAIL_JUMPS ! SEXP_USE_NO_FEATURES */ +#define SEXP_USE_TAIL_JUMPS 0 +#endif + +#ifndef SEXP_USE_RESERVE_OPCODE +#define SEXP_USE_RESERVE_OPCODE SEXP_USE_TAIL_JUMPS +#endif + +/* experimental optimization to avoid boxing locals which aren't set! */ +#ifndef SEXP_USE_UNBOXED_LOCALS +/* #define SEXP_USE_UNBOXED_LOCALS ! SEXP_USE_NO_FEATURES */ +#define SEXP_USE_UNBOXED_LOCALS 0 +#endif + +#ifndef SEXP_USE_DEBUG_VM +#define SEXP_USE_DEBUG_VM 0 +#endif + +#ifndef SEXP_USE_PROFILE_VM +#define SEXP_USE_PROFILE_VM 0 +#endif + +#ifndef SEXP_USE_EXTENDED_CHAR_NAMES +#define SEXP_USE_EXTENDED_CHAR_NAMES ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_UTF8_STRINGS +#define SEXP_USE_UTF8_STRINGS ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_MUTABLE_STRINGS +#define SEXP_USE_MUTABLE_STRINGS 1 +#endif + +#if (SEXP_USE_UTF8_STRINGS && SEXP_USE_MUTABLE_STRINGS) +#define SEXP_USE_PACKED_STRINGS 0 +#endif +#ifndef SEXP_USE_PACKED_STRINGS +#define SEXP_USE_PACKED_STRINGS 1 +#endif + +#ifndef SEXP_USE_STRING_STREAMS +#ifdef _WIN32 +#define SEXP_USE_STRING_STREAMS 0 +#else +#define SEXP_USE_STRING_STREAMS ! SEXP_USE_NO_FEATURES +#endif +#endif + +#ifndef SEXP_USE_AUTOCLOSE_PORTS +#define SEXP_USE_AUTOCLOSE_PORTS ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_GC_FILE_DESCRIPTORS +#define SEXP_USE_GC_FILE_DESCRIPTORS (SEXP_USE_AUTOCLOSE_PORTS &&!SEXP_USE_BOEHM && !defined(PLAN9)) +#endif + +#ifndef SEXP_USE_BIDIRECTIONAL_PORTS +#define SEXP_USE_BIDIRECTIONAL_PORTS ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_2010_EPOCH +#define SEXP_USE_2010_EPOCH ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_EPOCH_OFFSET +#if SEXP_USE_2010_EPOCH +#define SEXP_EPOCH_OFFSET 1262271600 +#else +#define SEXP_EPOCH_OFFSET 0 +#endif +#endif + +#ifndef SEXP_USE_CHECK_STACK +#define SEXP_USE_CHECK_STACK ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_GROW_STACK +#define SEXP_USE_GROW_STACK SEXP_USE_CHECK_STACK && ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_LONG_PROCEDURE_ARGS +#define SEXP_USE_LONG_PROCEDURE_ARGS ! SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_INIT_BCODE_SIZE +#define SEXP_INIT_BCODE_SIZE 128 +#endif +#ifndef SEXP_INIT_STACK_SIZE +#if SEXP_USE_CHECK_STACK +#define SEXP_INIT_STACK_SIZE 1024 +#else +#define SEXP_INIT_STACK_SIZE 8192 +#endif +#endif +#ifndef SEXP_MAX_STACK_SIZE +#define SEXP_MAX_STACK_SIZE SEXP_INIT_STACK_SIZE*1000 +#endif + +#ifndef SEXP_DEFAULT_EQUAL_BOUND +#define SEXP_DEFAULT_EQUAL_BOUND 100000 +#endif + +#ifndef SEXP_USE_IMAGE_LOADING +#define SEXP_USE_IMAGE_LOADING SEXP_USE_DL && !SEXP_USE_GLOBAL_HEAP && !SEXP_USE_BOEHM && !SEXP_USE_NO_FEATURES +#endif + +#ifndef SEXP_USE_MAIN_HELP +#define SEXP_USE_MAIN_HELP ! SEXP_USE_NO_FEATURES +#endif + +#if SEXP_USE_NATIVE_X86 +#undef SEXP_USE_BOEHM +#define SEXP_USE_BOEHM 1 +#undef SEXP_USE_FLONUMS +#define SEXP_USE_FLONUMS 0 +#undef SEXP_USE_BIGNUMS +#define SEXP_USE_BIGNUMS 0 +#undef SEXP_USE_RATIOS +#define SEXP_USE_RATIOS 0 +#undef SEXP_USE_COMPLEX +#define SEXP_USE_COMPLEX 0 +#undef SEXP_USE_UTF8_STRINGS +#define SEXP_USE_UTF8_STRINGS 0 +#undef SEXP_USE_SIMPLIFY +#define SEXP_USE_SIMPLIFY 0 +#endif + +#ifndef SEXP_USE_ALIGNED_BYTECODE +#if defined(__arm__) +#define SEXP_USE_ALIGNED_BYTECODE 1 +#else +#define SEXP_USE_ALIGNED_BYTECODE 0 +#endif +#endif + +#ifdef PLAN9 +#define strcasecmp cistrcmp +#define strncasecmp cistrncmp +#define strcasestr cistrstr +#define round(x) floor((x)+0.5) +#define trunc(x) floor((x)+0.5*(((x)<0)?1:0)) +#elif defined(_WIN32) +#define snprintf(buf, len, fmt, val) sprintf(buf, fmt, val) +#define strcasecmp lstrcmpi +#define strncasecmp(s1, s2, n) lstrcmpi(s1, s2) +#define round(x) floor((x)+0.5) +#define trunc(x) floor((x)+0.5*(((x)<0)?1:0)) +#define isnan(x) (x!=x) +#define isinf(x) (x > DBL_MAX || x < -DBL_MAX) +#endif + +#ifdef _WIN32 +#define sexp_pos_infinity (DBL_MAX*DBL_MAX) +#define sexp_neg_infinity -sexp_pos_infinity +#define sexp_nan log(-2) +#else +#define sexp_pos_infinity (1.0/0.0) +#define sexp_neg_infinity -sexp_pos_infinity +#define sexp_nan (0.0/0.0) +#endif + +#ifdef __MINGW32__ +#ifdef BUILDING_DLL +#define SEXP_API __declspec(dllexport) +#else +#define SEXP_API __declspec(dllimport) +#endif +#else +#define SEXP_API +#endif + +/************************************************************************/ +/* Feature signature. Used for image files and dynamically loaded */ +/* libraries to verify they are compatible with the compiled options . */ +/************************************************************************/ + +typedef char sexp_abi_identifier_t[8]; + +#if SEXP_USE_BOEHM +#define SEXP_ABI_GC "b" +#elif (SEXP_USE_HEADER_MAGIC && SEXP_USE_TRACK_ALLOC_SOURCE) +#define SEXP_ABI_GC "d" +#elif SEXP_USE_HEADER_MAGIC +#define SEXP_ABI_GC "m" +#elif SEXP_USE_TRACK_ALLOC_SOURCE +#define SEXP_ABI_GC "s" +#else +#define SEXP_ABI_GC "c" +#endif + +#if SEXP_USE_NATIVE_X86 +#define SEXP_ABI_BACKEND "x" +#else +#define SEXP_ABI_BACKEND "v" +#endif + +#if (SEXP_USE_RESERVE_OPCODE && SEXP_USE_AUTO_FORCE) +#define SEXP_ABI_INSTRUCTIONS "*" +#elif SEXP_USE_RESERVE_OPCODE +#define SEXP_ABI_INSTRUCTIONS "r" +#elif SEXP_USE_AUTO_FORCE +#define SEXP_ABI_INSTRUCTIONS "f" +#else +#define SEXP_ABI_INSTRUCTIONS "-" +#endif + +#if SEXP_USE_GREEN_THREADS +#define SEXP_ABI_THREADS "g" +#else +#define SEXP_ABI_THREADS "-" +#endif + +#if SEXP_USE_MODULES +#define SEXP_ABI_MODULES "m" +#else +#define SEXP_ABI_MODULES "-" +#endif + +#if (SEXP_USE_COMPLEX && SEXP_USE_RATIOS) +#define SEXP_ABI_NUMBERS "*" +#elif SEXP_USE_COMPLEX +#define SEXP_ABI_NUMBERS "c" +#elif SEXP_USE_RATIOS +#define SEXP_ABI_NUMBERS "r" +#elif SEXP_USE_BIGNUMS +#define SEXP_ABI_NUMBERS "b" +#elif SEXP_USE_INFINITIES +#define SEXP_ABI_NUMBERS "i" +#elif SEXP_USE_FLONUMS +#define SEXP_ABI_NUMBERS "f" +#else +#define SEXP_ABI_NUMBERS "-" +#endif + +#if SEXP_USE_UTF8_STRINGS +#define SEXP_ABI_STRINGS "u" +#elif SEXP_USE_PACKED_STRINGS +#define SEXP_ABI_STRINGS "p" +#else +#define SEXP_ABI_STRINGS "-" +#endif + +#if SEXP_USE_HUFF_SYMS +#define SEXP_ABI_SYMS "h" +#else +#define SEXP_ABI_SYMS "-" +#endif + +#define SEXP_ABI_IDENTIFIER \ + (SEXP_ABI_GC SEXP_ABI_BACKEND SEXP_ABI_INSTRUCTIONS SEXP_ABI_THREADS \ + SEXP_ABI_MODULES SEXP_ABI_NUMBERS SEXP_ABI_STRINGS SEXP_ABI_SYMS) + +#define sexp_version_compatible(ctx, subver, genver) (strcmp((subver), (genver)) == 0) +#define sexp_abi_compatible(ctx, subabi, genabi) (strcmp((subabi), (genabi)) == 0) diff --git a/include/chibi/sexp.h b/include/chibi/sexp.h new file mode 100755 index 00000000..13025024 --- /dev/null +++ b/include/chibi/sexp.h @@ -0,0 +1,1495 @@ +/* sexp.h -- header for sexp library */ +/* Copyright (c) 2009-2012 Alex Shinn. All rights reserved. */ +/* BSD-style license: http://synthcode.com/license.txt */ + +#ifndef SEXP_H +#define SEXP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define SEXP_MODULE_PATH_VAR "CHIBI_MODULE_PATH" + +#include "chibi/features.h" +#include "chibi/install.h" + +#if defined(_WIN32) || defined(__MINGW32__) +#include +#define sexp_isalpha(x) ((isalpha)((int)(x))) +#define sexp_isxdigit(x) ((isxdigit)((int)(x))) +#define sexp_isdigit(x) ((isdigit)((int)(x))) +#define sexp_tolower(x) ((tolower)((int)(x))) +#define sexp_toupper(x) ((toupper)((int)(x))) +#else +#if SEXP_USE_DL +#include +#endif +#if SEXP_USE_GREEN_THREADS || SEXP_USE_GC_FILE_DESCRIPTORS +#include +#include +#endif +#if SEXP_USE_GREEN_THREADS +#include +#include +#endif +#define sexp_isalpha(x) (isalpha(x)) +#define sexp_isxdigit(x) (isxdigit(x)) +#define sexp_isdigit(x) (isdigit(x)) +#define sexp_tolower(x) (tolower(x)) +#define sexp_toupper(x) (toupper(x)) +#endif + +#if SEXP_USE_GC_FILE_DESCRIPTORS +#define sexp_out_of_file_descriptors() (errno == EMFILE) +#else +#define sexp_out_of_file_descriptors() (0) +#endif + +#ifdef __GNUC__ +#define SEXP_NO_WARN_UNUSED __attribute__((unused)) +#else +#define SEXP_NO_WARN_UNUSED +#endif + +#ifdef PLAN9 +#include +#include +#include +#include +#include <9p.h> +typedef unsigned long size_t; +#else +#include +#include +#include +#include +#include +#include +#include +#if SEXP_USE_FLONUMS +#include +#include +#endif +#endif + +#include +#include + +/* tagging system + * bits end in 00: pointer + * 01: fixnum + * 011: immediate flonum (optional) + * 111: immediate symbol (optional) + * 000110: char + * 001110: unique immediate (NULL, TRUE, FALSE) + */ + +#define SEXP_FIXNUM_BITS 2 +#define SEXP_IMMEDIATE_BITS 3 +#define SEXP_EXTENDED_BITS 6 + +#define SEXP_FIXNUM_MASK 3 +#define SEXP_IMMEDIATE_MASK 7 +#define SEXP_EXTENDED_MASK 63 + +#define SEXP_POINTER_TAG 0 +#define SEXP_FIXNUM_TAG 1 +#define SEXP_ISYMBOL_TAG 7 +#define SEXP_IFLONUM_TAG 3 +#define SEXP_CHAR_TAG 6 +#define SEXP_EXTENDED_TAG 14 + +#ifndef SEXP_POINTER_MAGIC +#define SEXP_POINTER_MAGIC 0xFDCA9764uL /* arbitrary */ +#endif + +#if SEXP_USE_HASH_SYMS +#define SEXP_SYMBOL_TABLE_SIZE 389 +#else +#define SEXP_SYMBOL_TABLE_SIZE 1 +#endif + +enum sexp_types { + SEXP_OBJECT, + SEXP_TYPE, + SEXP_FIXNUM, + SEXP_NUMBER, + SEXP_CHAR, + SEXP_BOOLEAN, + SEXP_PAIR, + SEXP_SYMBOL, + SEXP_BYTES, + SEXP_STRING, + SEXP_VECTOR, + SEXP_FLONUM, + SEXP_BIGNUM, +#if SEXP_USE_RATIOS + SEXP_RATIO, +#endif +#if SEXP_USE_COMPLEX + SEXP_COMPLEX, +#endif + SEXP_IPORT, + SEXP_OPORT, + SEXP_EXCEPTION, + SEXP_PROCEDURE, + SEXP_MACRO, + SEXP_SYNCLO, + SEXP_ENV, + SEXP_BYTECODE, + SEXP_CORE, +#if SEXP_USE_DL + SEXP_DL, +#endif + SEXP_OPCODE, + SEXP_LAMBDA, + SEXP_CND, + SEXP_REF, + SEXP_SET, + SEXP_SEQ, + SEXP_LIT, + SEXP_STACK, + SEXP_CONTEXT, + SEXP_CPOINTER, +#if SEXP_USE_AUTO_FORCE + SEXP_PROMISE, +#endif + SEXP_NUM_CORE_TYPES +}; + +/* procedure flags */ +#define SEXP_PROC_NONE 0uL +#define SEXP_PROC_VARIADIC 1uL +#define SEXP_PROC_UNUSED_REST 2uL + +#ifdef _WIN32 +typedef unsigned short sexp_tag_t; +typedef SIZE_T sexp_uint_t; +typedef SSIZE_T sexp_sint_t; +#define sexp_heap_align(n) sexp_align(n, 5) +#elif SEXP_64_BIT +typedef unsigned int sexp_tag_t; +typedef unsigned long sexp_uint_t; +typedef long sexp_sint_t; +#define sexp_heap_align(n) sexp_align(n, 5) +#elif defined(__CYGWIN__) +typedef unsigned short sexp_tag_t; +typedef unsigned int sexp_uint_t; +typedef int sexp_sint_t; +#define sexp_heap_align(n) sexp_align(n, 5) +#else +typedef unsigned short sexp_tag_t; +typedef unsigned int sexp_uint_t; +typedef int sexp_sint_t; +#define sexp_heap_align(n) sexp_align(n, 4) +#endif + +#if SEXP_USE_LONG_PROCEDURE_ARGS +typedef int sexp_proc_num_args_t; +#else +typedef short sexp_proc_num_args_t; +#endif + +typedef struct sexp_struct *sexp; + +#define sexp_heap_pad_size(s) (sizeof(struct sexp_heap_t) + (s) + sexp_heap_align(1)) +#define sexp_free_chunk_size (sizeof(struct sexp_free_list_t)) +#define sexp_heap_first_block(h) ((sexp)(h->data + sexp_heap_align(sexp_free_chunk_size))) +#define sexp_heap_last_block(h) ((sexp)((char*)h->data + h->size - sexp_heap_align(sexp_free_chunk_size))) +#define sexp_heap_end(h) ((sexp)((char*)h->data + h->size)) + +#define __HALF_MAX_SIGNED(type) ((type)1 << (sizeof(type)*8-2)) +#define __MAX_SIGNED(type) (__HALF_MAX_SIGNED(type) - 1 + __HALF_MAX_SIGNED(type)) +#define __MIN_SIGNED(type) (-1 - __MAX_SIGNED(type)) + +#define SEXP_UINT_T_MAX ((sexp_uint_t)-1) +#define SEXP_UINT_T_MIN (0) +#define SEXP_SINT_T_MAX __MAX_SIGNED(sexp_sint_t) +#define SEXP_SINT_T_MIN __MIN_SIGNED(sexp_sint_t) + +#define SEXP_MAX_FIXNUM ((((sexp_sint_t)1)<<(sizeof(sexp_sint_t)*8-SEXP_FIXNUM_BITS-1))-1) +#define SEXP_MIN_FIXNUM (-SEXP_MAX_FIXNUM-1) + +#if SEXP_USE_SELF_PARAMETER +#define sexp_api_params(self, n) , sexp self, sexp_sint_t n +#define sexp_api_pass(self, n) , self, n +#else +#define sexp_api_params(self, n) +#define sexp_api_pass(self, n) +#endif + +/* procedure types */ +typedef sexp (*sexp_proc1) (sexp, sexp, sexp_sint_t); +typedef sexp (*sexp_proc2) (sexp, sexp, sexp_sint_t, sexp); +typedef sexp (*sexp_proc3) (sexp, sexp, sexp_sint_t, sexp, sexp); +typedef sexp (*sexp_proc4) (sexp, sexp, sexp_sint_t, sexp, sexp, sexp); +typedef sexp (*sexp_proc5) (sexp, sexp, sexp_sint_t, sexp, sexp, sexp, sexp); +typedef sexp (*sexp_proc6) (sexp, sexp, sexp_sint_t, sexp, sexp, sexp, sexp, sexp); +typedef sexp (*sexp_proc7) (sexp, sexp, sexp_sint_t, sexp, sexp, sexp, sexp, sexp, sexp); +typedef sexp (*sexp_init_proc)(sexp, sexp, sexp_sint_t, sexp, const char*, sexp_abi_identifier_t); + +typedef struct sexp_free_list_t *sexp_free_list; +struct sexp_free_list_t { + sexp_uint_t size; + sexp_free_list next; +}; + +typedef struct sexp_heap_t *sexp_heap; +struct sexp_heap_t { + sexp_uint_t size, max_size; + sexp_free_list free_list; + sexp_heap next; + /* note this must be aligned on a proper heap boundary, */ + /* so we can't just use char data[] */ + char *data; +}; + +struct sexp_gc_var_t { + sexp *var; +#if SEXP_USE_DEBUG_GC + char *name; +#endif + struct sexp_gc_var_t *next; +}; + +struct sexp_type_struct { + sexp_tag_t tag; + short field_base, field_eq_len_base, field_len_base, field_len_off; + unsigned short field_len_scale; + short size_base, size_off; + unsigned short size_scale; + short weak_base, weak_len_base, weak_len_off, weak_len_scale, weak_len_extra; + short depth; + sexp name, cpl, slots, dl, id, print; + sexp_proc2 finalize; +}; + +struct sexp_opcode_struct { + unsigned char op_class, code, num_args, flags, inverse; + sexp name, data, data2, proc, ret_type, arg1_type, arg2_type, arg3_type, + argn_type, methods, dl; + sexp_proc1 func; +}; + +struct sexp_core_form_struct { + char code; + sexp name; +}; + +struct sexp_struct { + sexp_tag_t tag; + char markedp; + unsigned int immutablep:1; + unsigned int freep:1; + unsigned int brokenp:1; + unsigned int syntacticp:1; +#if SEXP_USE_TRACK_ALLOC_SOURCE + const char* source; +#endif +#if SEXP_USE_HEADER_MAGIC + unsigned int magic; +#endif + union { + /* basic types */ + double flonum; + struct sexp_type_struct type; + struct { + sexp car, cdr; + sexp source; + } pair; + struct { + sexp_uint_t length; + sexp data[]; + } vector; + struct { + sexp_uint_t length; + char data[]; + } bytes; + struct { +#if SEXP_USE_PACKED_STRINGS + sexp_uint_t length; + char data[]; +#else + sexp_uint_t offset, length; + sexp bytes; +#endif + } string; + struct { + sexp_uint_t length; + char data[]; + } symbol; + struct { + FILE *stream; + char *buf; + char openp, bidirp, binaryp, no_closep, sourcep, blockedp, fold_casep; + sexp_uint_t offset, line, flags; + size_t size; + sexp name; + sexp cookie; + } port; + struct { + sexp kind, message, irritants, procedure, source; + } exception; + struct { + signed char sign; + sexp_uint_t length; + sexp_uint_t data[]; + } bignum; + struct { + sexp numerator, denominator; + } ratio; + struct { + sexp real, imag; + } complex; + struct { + sexp_uint_t length; + void *value; + sexp parent; + char body[]; + } cpointer; + /* runtime types */ + struct { + sexp parent, lambda, bindings; +#if SEXP_USE_RENAME_BINDINGS + sexp renames; +#endif + } env; + struct { + sexp_uint_t length; + sexp name, literals, source; + unsigned char data[]; + } bytecode; + struct { + char flags; + sexp_proc_num_args_t num_args; + sexp bc, vars; + } procedure; + struct { + sexp proc, env, source; + } macro; + struct { + sexp env, free_vars, expr; + } synclo; + struct { + sexp file; + void* handle; + } dl; + struct sexp_opcode_struct opcode; + struct sexp_core_form_struct core; + /* ast types */ + struct { + sexp name, params, body, defs, locals, flags, fv, sv, ret, types, source; + } lambda; + struct { + sexp test, pass, fail, source; + } cnd; + struct { + sexp var, value, source; + } set; + struct { + sexp name, cell, source; + } ref; + struct { + sexp ls, source; + } seq; + struct { + sexp value, source; + } lit; + /* compiler state */ + struct { + sexp_uint_t length, top; + sexp data[]; + } stack; + struct { + sexp_heap heap; + struct sexp_gc_var_t *saves; +#if SEXP_USE_GREEN_THREADS + sexp_sint_t refuel; + unsigned char* ip; + struct timeval tval; +#endif + char tailp, tracep, timeoutp, waitp; + sexp_uint_t pos, depth, last_fp; + sexp bc, lambda, stack, env, fv, parent, child, + globals, dk, params, proc, name, specific, event; +#if SEXP_USE_DL + sexp dl; +#endif + } context; +#if SEXP_USE_AUTO_FORCE + struct { + int donep; + sexp thunk, value; + } promise; +#endif + } value; +}; + +#define SEXP_MAKE_IMMEDIATE(n) ((sexp) ((n<value.x)) +#define sexp_offsetof(type, f) (offsetof(struct sexp_struct, value.type.f)) +#define sexp_offsetof_slot0 (offsetof(struct sexp_struct, value)) +#define sexp_sizeof_header (sexp_sizeof(flonum) - sizeof(double)) + +#if SEXP_USE_TRACK_ALLOC_SOURCE +#define sexp_with_current_source0(file, line) file ": " #line +#define sexp_with_current_source(file, line) , sexp_with_current_source0(file, line) +#else +#define sexp_with_current_source(file, line) +#endif + +#define sexp_alloc_tagged(ctx, type, tag) sexp_alloc_tagged_aux(ctx, type, tag sexp_with_current_source(__FILE__, __LINE__)) + +#define sexp_alloc_type(ctx, type, tag) sexp_alloc_tagged(ctx, sexp_sizeof(type), tag) +#define sexp_alloc_bytecode(ctx, i) sexp_alloc_tagged(ctx, sexp_sizeof(bytecode) + i, SEXP_BYTECODE) + +#if SEXP_USE_BIGNUMS +#include "chibi/bignum.h" +#endif + +/***************************** predicates *****************************/ + +#define sexp_truep(x) ((x) != SEXP_FALSE) +#define sexp_not(x) ((x) == SEXP_FALSE) + +#define sexp_nullp(x) ((x) == SEXP_NULL) +#define sexp_pointerp(x) (((sexp_uint_t)(x) & SEXP_FIXNUM_MASK) == SEXP_POINTER_TAG) +#define sexp_fixnump(x) (((sexp_uint_t)(x) & SEXP_FIXNUM_MASK) == SEXP_FIXNUM_TAG) +#define sexp_isymbolp(x) (((sexp_uint_t)(x) & SEXP_IMMEDIATE_MASK) == SEXP_ISYMBOL_TAG) +#define sexp_charp(x) (((sexp_uint_t)(x) & SEXP_EXTENDED_MASK) == SEXP_CHAR_TAG) +#define sexp_booleanp(x) (((x) == SEXP_TRUE) || ((x) == SEXP_FALSE)) + +#define sexp_pointer_tag(x) ((x)->tag) +#define sexp_markedp(x) ((x)->markedp) +#define sexp_flags(x) ((x)->flags) +#define sexp_immutablep(x) ((x)->immutablep) +#define sexp_freep(x) ((x)->freep) +#define sexp_brokenp(x) ((x)->brokenp) +#define sexp_pointer_magic(x) ((x)->magic) + +#if SEXP_USE_TRACK_ALLOC_SOURCE +#define sexp_pointer_source(x) ((x)->source) +#else +#define sexp_pointer_source(x) "" +#endif + +#define sexp_check_tag(x,t) (sexp_pointerp(x) && (sexp_pointer_tag(x) == (t))) + +#define sexp_slot_ref(x,i) (((sexp*)&((x)->value))[i]) +#define sexp_slot_set(x,i,v) (((sexp*)&((x)->value))[i] = (v)) + +#define sexp_isa(a, b) (sexp_pointerp(a) && sexp_typep(b) && (sexp_pointer_tag(a) == sexp_type_tag(b))) + +#if SEXP_USE_IMMEDIATE_FLONUMS +union sexp_flonum_conv { + float flonum; + unsigned int bits; +}; +#define sexp_flonump(x) (((sexp_uint_t)(x) & SEXP_IMMEDIATE_MASK) == SEXP_IFLONUM_TAG) +SEXP_API sexp sexp_flonum_predicate (sexp ctx, sexp x); +#if SEXP_64_BIT +SEXP_API float sexp_flonum_value (sexp x); +SEXP_API sexp sexp_make_flonum(sexp ctx, float f); +#else +#define sexp_make_flonum(ctx, x) ((sexp) ((((union sexp_flonum_conv)((float)(x))).bits & ~SEXP_IMMEDIATE_MASK) + SEXP_IFLONUM_TAG)) +#define sexp_flonum_value(x) (((union sexp_flonum_conv)(((unsigned int)(x)) & ~SEXP_IMMEDIATE_MASK)).flonum) +#endif +#else +#define sexp_flonump(x) (sexp_check_tag(x, SEXP_FLONUM)) +#define sexp_flonum_value(f) ((f)->value.flonum) +sexp sexp_make_flonum(sexp ctx, double f); +#endif + +#define sexp_typep(x) (sexp_check_tag(x, SEXP_TYPE)) +#define sexp_pairp(x) (sexp_check_tag(x, SEXP_PAIR)) +#define sexp_stringp(x) (sexp_check_tag(x, SEXP_STRING)) +#define sexp_lsymbolp(x) (sexp_check_tag(x, SEXP_SYMBOL)) +#define sexp_bytesp(x) (sexp_check_tag(x, SEXP_BYTES)) +#define sexp_vectorp(x) (sexp_check_tag(x, SEXP_VECTOR)) +#define sexp_iportp(x) (sexp_check_tag(x, SEXP_IPORT)) +#if SEXP_USE_BIDIRECTIONAL_PORTS +#define sexp_oportp(x) (sexp_check_tag(x, SEXP_OPORT) || (sexp_check_tag(x, SEXP_IPORT) && sexp_port_bidirp(x))) +#else +#define sexp_oportp(x) (sexp_check_tag(x, SEXP_OPORT)) +#endif +#if SEXP_USE_BIGNUMS +#define sexp_bignump(x) (sexp_check_tag(x, SEXP_BIGNUM)) +#else +#define sexp_bignump(x) 0 +#endif +#if SEXP_USE_RATIOS +#define sexp_ratiop(x) (sexp_check_tag(x, SEXP_RATIO)) +#else +#define sexp_ratiop(x) 0 +#endif +#if SEXP_USE_COMPLEX +#define sexp_complexp(x) (sexp_check_tag(x, SEXP_COMPLEX)) +#else +#define sexp_complexp(x) 0 +#endif +#define sexp_cpointerp(x) (sexp_check_tag(x, SEXP_CPOINTER)) +#define sexp_exceptionp(x) (sexp_check_tag(x, SEXP_EXCEPTION)) +#define sexp_procedurep(x) (sexp_check_tag(x, SEXP_PROCEDURE)) +#define sexp_envp(x) (sexp_check_tag(x, SEXP_ENV)) +#define sexp_bytecodep(x) (sexp_check_tag(x, SEXP_BYTECODE)) +#define sexp_corep(x) (sexp_check_tag(x, SEXP_CORE)) +#define sexp_dlp(x) (sexp_check_tag(x, SEXP_DL)) +#define sexp_opcodep(x) (sexp_check_tag(x, SEXP_OPCODE)) +#define sexp_macrop(x) (sexp_check_tag(x, SEXP_MACRO)) +#define sexp_syntacticp(x) (sexp_corep(x) || sexp_macrop(x)) +#define sexp_synclop(x) (sexp_check_tag(x, SEXP_SYNCLO)) +#define sexp_lambdap(x) (sexp_check_tag(x, SEXP_LAMBDA)) +#define sexp_cndp(x) (sexp_check_tag(x, SEXP_CND)) +#define sexp_refp(x) (sexp_check_tag(x, SEXP_REF)) +#define sexp_setp(x) (sexp_check_tag(x, SEXP_SET)) +#define sexp_seqp(x) (sexp_check_tag(x, SEXP_SEQ)) +#define sexp_litp(x) (sexp_check_tag(x, SEXP_LIT)) +#define sexp_contextp(x) (sexp_check_tag(x, SEXP_CONTEXT)) +#define sexp_promisep(x) (sexp_check_tag(x, SEXP_PROMISE)) + +#define sexp_applicablep(x) (sexp_procedurep(x) || sexp_opcodep(x)) + +#if SEXP_USE_HUFF_SYMS +#define sexp_symbolp(x) (sexp_isymbolp(x) || sexp_lsymbolp(x)) +#else +#define sexp_symbolp(x) (sexp_lsymbolp(x)) +#endif + +#define sexp_idp(x) \ + (sexp_symbolp(x) || (sexp_synclop(x) && sexp_symbolp(sexp_synclo_expr(x)))) + +#define sexp_portp(x) (sexp_check_tag(x, SEXP_IPORT) || sexp_check_tag(x, SEXP_OPORT)) + +#if SEXP_USE_STRING_STREAMS +#define sexp_stream_portp(x) 1 +#else +#define sexp_stream_portp(x) (sexp_port_stream(x) != NULL) +#endif + +/***************************** constructors ****************************/ + +#define sexp_make_boolean(x) ((x) ? SEXP_TRUE : SEXP_FALSE) +#define sexp_unbox_boolean(x) (((x) == SEXP_FALSE) ? 0 : 1) + +#define sexp_make_fixnum(n) ((sexp) ((((sexp_sint_t)(n))<>SEXP_FIXNUM_BITS) + +#define SEXP_NEG_ONE sexp_make_fixnum(-1) +#define SEXP_ZERO sexp_make_fixnum(0) +#define SEXP_ONE sexp_make_fixnum(1) +#define SEXP_TWO sexp_make_fixnum(2) +#define SEXP_THREE sexp_make_fixnum(3) +#define SEXP_FOUR sexp_make_fixnum(4) +#define SEXP_FIVE sexp_make_fixnum(5) +#define SEXP_SIX sexp_make_fixnum(6) +#define SEXP_SEVEN sexp_make_fixnum(7) +#define SEXP_EIGHT sexp_make_fixnum(8) +#define SEXP_NINE sexp_make_fixnum(9) +#define SEXP_TEN sexp_make_fixnum(10) + +#define sexp_make_character(n) ((sexp) ((((sexp_sint_t)(n))<>SEXP_EXTENDED_BITS)) + +#define sexp_fixnum_to_double(x) ((double)sexp_unbox_fixnum(x)) + +#if SEXP_USE_PLACEHOLDER_DIGITS +#define sexp_placeholder_digit_p(c) ((c) == SEXP_PLACEHOLDER_DIGIT) +#else +#define sexp_placeholder_digit_p(c) 0 +#endif + +#define sexp_placeholder_digit_value(base) ((base)/2) + +#if SEXP_USE_FLONUMS +#define sexp_fp_integerp(x) (sexp_flonum_value(x) == trunc(sexp_flonum_value(x))) +#define _or_integer_flonump(x) || (sexp_flonump(x) && sexp_fp_integerp(x)) +#else +#define _or_integer_flonump(x) +#endif + +#if SEXP_USE_BIGNUMS +SEXP_API sexp sexp_make_integer(sexp ctx, sexp_lsint_t x); +SEXP_API sexp sexp_make_unsigned_integer(sexp ctx, sexp_luint_t x); +#define sexp_exact_integerp(x) (sexp_fixnump(x) || sexp_bignump(x)) +#else +#define sexp_make_integer(ctx, x) sexp_make_fixnum(x) +#define sexp_make_unsigned_integer(ctx, x) sexp_make_fixnum(x) +#define sexp_exact_integerp(x) sexp_fixnump(x) +#endif + +#define sexp_integerp(x) (sexp_exact_integerp(x) _or_integer_flonump(x)) + +#if SEXP_USE_RATIOS +#define sexp_exactp(x) (sexp_exact_integerp(x) || sexp_ratiop(x)) +#else +#define sexp_exactp(x) sexp_exact_integerp(x) +#endif + +#if SEXP_USE_FLONUMS +#define sexp_fixnum_to_flonum(ctx, x) (sexp_make_flonum(ctx, sexp_unbox_fixnum(x))) +#if SEXP_USE_RATIOS +#define sexp_realp(x) (sexp_exact_integerp(x) || sexp_flonump(x) || sexp_ratiop(x)) +#else +#define sexp_realp(x) (sexp_exact_integerp(x) || sexp_flonump(x)) +#endif +#else +#define sexp_fixnum_to_flonum(ctx, x) (x) +#define sexp_realp(x) sexp_exact_integerp(x) +#endif + +#if SEXP_USE_COMPLEX +#define sexp_numberp(x) (sexp_realp(x) || sexp_complexp(x)) +#else +#define sexp_numberp(x) (sexp_realp(x)) +#endif + +#define sexp_exact_negativep(x) (sexp_fixnump(x) ? (sexp_unbox_fixnum(x) < 0) \ + : (SEXP_USE_BIGNUMS && sexp_bignump(x)) \ + && (sexp_bignum_sign(x) < 0)) +#define sexp_negativep(x) (sexp_exact_negativep(x) || \ + (sexp_flonump(x) && sexp_flonum_value(x) < 0)) +#define sexp_positivep(x) (!(sexp_negativep(x))) + +#if SEXP_USE_BIGNUMS +#define sexp_oddp(x) (sexp_fixnump(x) ? sexp_unbox_fixnum(x) & 1 : \ + sexp_bignump(x) && (sexp_bignum_data(x)[0] & 1)) +#else +#define sexp_oddp(x) (sexp_fixnump(x) && (sexp_unbox_fixnum(x) & 1)) +#endif +#define sexp_evenp(x) (!(sexp_oddp(x))) + +#define sexp_negate_exact(x) \ + if (sexp_bignump(x)) \ + sexp_bignum_sign(x) = -sexp_bignum_sign(x); \ + else if (sexp_fixnump(x)) \ + x = sexp_fx_neg(x); + +#if SEXP_USE_IMMEDIATE_FLONUMS +#define sexp_negate_flonum(x) (x) = sexp_make_flonum(NULL, -(sexp_flonum_value(x))) +#else +#define sexp_negate_flonum(x) sexp_flonum_value(x) = -(sexp_flonum_value(x)) +#endif + +#define sexp_negate(x) \ + if (sexp_flonump(x)) \ + sexp_negate_flonum(x); \ + else \ + sexp_negate_exact(x) + +#if SEXP_USE_FLONUMS || SEXP_USE_BIGNUMS +#define sexp_uint_value(x) ((sexp_uint_t)(sexp_fixnump(x) ? sexp_unbox_fixnum(x) : sexp_bignum_data(x)[0])) +#define sexp_sint_value(x) ((sexp_sint_t)(sexp_fixnump(x) ? sexp_unbox_fixnum(x) : sexp_bignum_sign(x)*sexp_bignum_data(x)[0])) +#else +#define sexp_uint_value(x) ((sexp_uint_t)sexp_unbox_fixnum(x)) +#define sexp_sint_value(x) ((sexp_sint_t)sexp_unbox_fixnum(x)) +#endif + +#define sexp_shift_epoch(x) ((x)-SEXP_EPOCH_OFFSET) +#define sexp_unshift_epoch(x) ((x)+SEXP_EPOCH_OFFSET) + +/*************************** field accessors **************************/ + +#if SEXP_USE_SAFE_ACCESSORS +#define sexp_field(x, type, id, field) (*(((x) && sexp_check_tag(x, id)) ? &((x)->value.type.field) : (fprintf(stderr, "invalid field access in %s line %d: %p (%d) isn't a "#type"\n", __FILE__, __LINE__, x, (int)(sexp_pointerp(x) ? sexp_pointer_tag(x) : -1)), &(((sexp)NULL)->value.type.field)))) +#define sexp_pred_field(x, type, pred, field) (*(((x) && pred(x)) ? &((x)->value.type.field) : (fprintf(stderr, "invalid field access in %s line %d: %p (%d) isn't a "#type"\n", __FILE__, __LINE__, x, (int)(sexp_pointerp(x) ? sexp_pointer_tag(x) : -1)), &(((sexp)NULL)->value.type.field)))) +#define sexp_cpointer_field(x, field) (*(((x) && sexp_pointerp(x) && sexp_pointer_tag(x) >= SEXP_CPOINTER) ? &((x)->value.cpointer.field) : (fprintf(stderr, "invalid field access in %s line %d: %p (%d) isn't a cpointer\n", __FILE__, __LINE__, x, (int)(sexp_pointerp(x) ? sexp_pointer_tag(x) : -1)), &(((sexp)NULL)->value.cpointer.field)))) +#else +#define sexp_field(x, type, id, field) ((x)->value.type.field) +#define sexp_pred_field(x, type, pred, field) ((x)->value.type.field) +#define sexp_cpointer_field(x, field) ((x)->value.cpointer.field) +#endif + +#define sexp_vector_length(x) (sexp_field(x, vector, SEXP_VECTOR, length)) +#define sexp_vector_data(x) (sexp_field(x, vector, SEXP_VECTOR, data)) + +#if SEXP_USE_SAFE_ACCESSORS +#define sexp_vector_ref(x,i) (sexp_unbox_fixnum(i)>=0 && sexp_unbox_fixnum(i)=0 && sexp_unbox_fixnum(i)tag = SEXP_BYTES, x) +#else +#define sexp_string_to_bytes(ctx, x) sexp_string_bytes(x) +#endif + +#define sexp_bytes_ref(x, i) (sexp_make_fixnum((unsigned char)sexp_bytes_data(x)[sexp_unbox_fixnum(i)])) +#define sexp_bytes_set(x, i, v) (sexp_bytes_data(x)[sexp_unbox_fixnum(i)] = sexp_unbox_fixnum(v)) + +#define sexp_string_ref(x, i) (sexp_make_character((unsigned char)sexp_string_data(x)[sexp_unbox_fixnum(i)])) +#define sexp_string_set(x, i, v) (sexp_string_data(x)[sexp_unbox_fixnum(i)] = sexp_unbox_character(v)) + +#define sexp_lsymbol_data(x) (sexp_field(x, symbol, SEXP_SYMBOL, data)) +#define sexp_lsymbol_length(x) (sexp_field(x, symbol, SEXP_SYMBOL, length)) + +#define sexp_port_stream(p) (sexp_pred_field(p, port, sexp_portp, stream)) +#define sexp_port_name(p) (sexp_pred_field(p, port, sexp_portp, name)) +#define sexp_port_line(p) (sexp_pred_field(p, port, sexp_portp, line)) +#define sexp_port_openp(p) (sexp_pred_field(p, port, sexp_portp, openp)) +#define sexp_port_bidirp(p) (sexp_pred_field(p, port, sexp_portp, bidirp)) +#define sexp_port_binaryp(p) (sexp_pred_field(p, port, sexp_portp, binaryp)) +#define sexp_port_no_closep(p) (sexp_pred_field(p, port, sexp_portp, no_closep)) +#define sexp_port_sourcep(p) (sexp_pred_field(p, port, sexp_portp, sourcep)) +#define sexp_port_blockedp(p) (sexp_pred_field(p, port, sexp_portp, blockedp)) +#define sexp_port_fold_casep(p) (sexp_pred_field(p, port, sexp_portp, fold_casep)) +#define sexp_port_cookie(p) (sexp_pred_field(p, port, sexp_portp, cookie)) +#define sexp_port_buf(p) (sexp_pred_field(p, port, sexp_portp, buf)) +#define sexp_port_size(p) (sexp_pred_field(p, port, sexp_portp, size)) +#define sexp_port_offset(p) (sexp_pred_field(p, port, sexp_portp, offset)) +#define sexp_port_flags(p) (sexp_pred_field(p, port, sexp_portp, flags)) + +#define sexp_ratio_numerator(q) (sexp_pred_field(q, ratio, sexp_ratiop, numerator)) +#define sexp_ratio_denominator(q) (sexp_pred_field(q, ratio, sexp_ratiop, denominator)) + +#define sexp_complex_real(q) (sexp_pred_field(q, complex, sexp_complexp, real)) +#define sexp_complex_imag(q) (sexp_pred_field(q, complex, sexp_complexp, imag)) + +#define sexp_exception_kind(x) (sexp_field(x, exception, SEXP_EXCEPTION, kind)) +#define sexp_exception_message(x) (sexp_field(x, exception, SEXP_EXCEPTION, message)) +#define sexp_exception_irritants(x) (sexp_field(x, exception, SEXP_EXCEPTION, irritants)) +#define sexp_exception_procedure(x) (sexp_field(x, exception, SEXP_EXCEPTION, procedure)) +#define sexp_exception_source(x) (sexp_field(x, exception, SEXP_EXCEPTION, source)) + +#define sexp_cpointer_freep(x) (sexp_freep(x)) +#define sexp_cpointer_length(x) (sexp_cpointer_field(x, length)) +#define sexp_cpointer_body(x) (sexp_cpointer_field(x, body)) +#define sexp_cpointer_parent(x) (sexp_cpointer_field(x, parent)) +#define sexp_cpointer_value(x) (sexp_cpointer_field(x, value)) +#define sexp_cpointer_maybe_null_value(x) (sexp_not(x) ? NULL : sexp_cpointer_value(x)) + +#define sexp_bytecode_length(x) (sexp_field(x, bytecode, SEXP_BYTECODE, length)) +#define sexp_bytecode_name(x) (sexp_field(x, bytecode, SEXP_BYTECODE, name)) +#define sexp_bytecode_literals(x) (sexp_field(x, bytecode, SEXP_BYTECODE, literals)) +#define sexp_bytecode_source(x) (sexp_field(x, bytecode, SEXP_BYTECODE, source)) +#define sexp_bytecode_data(x) (sexp_field(x, bytecode, SEXP_BYTECODE, data)) + +#define sexp_env_syntactic_p(x) ((x)->syntacticp) +#define sexp_env_parent(x) (sexp_field(x, env, SEXP_ENV, parent)) +#define sexp_env_bindings(x) (sexp_field(x, env, SEXP_ENV, bindings)) +#define sexp_env_renames(x) (sexp_field(x, env, SEXP_ENV, renames)) +#define sexp_env_local_p(x) (sexp_env_parent(x)) +#define sexp_env_global_p(x) (! sexp_env_local_p(x)) +#define sexp_env_lambda(x) (sexp_field(x, env, SEXP_ENV, lambda)) + +#define sexp_macro_proc(x) (sexp_field(x, macro, SEXP_MACRO, proc)) +#define sexp_macro_env(x) (sexp_field(x, macro, SEXP_MACRO, env)) +#define sexp_macro_source(x) (sexp_field(x, macro, SEXP_MACRO, source)) + +#define sexp_synclo_env(x) (sexp_field(x, synclo, SEXP_SYNCLO, env)) +#define sexp_synclo_free_vars(x) (sexp_field(x, synclo, SEXP_SYNCLO, free_vars)) +#define sexp_synclo_expr(x) (sexp_field(x, synclo, SEXP_SYNCLO, expr)) + +#define sexp_core_code(x) (sexp_field(x, core, SEXP_CORE, code)) +#define sexp_core_name(x) (sexp_field(x, core, SEXP_CORE, name)) + +#define sexp_dl_file(x) (sexp_field(x, dl, SEXP_DL, file)) +#define sexp_dl_handle(x) (sexp_field(x, dl, SEXP_DL, handle)) + +#define sexp_opcode_class(x) (sexp_field(x, opcode, SEXP_OPCODE, op_class)) +#define sexp_opcode_code(x) (sexp_field(x, opcode, SEXP_OPCODE, code)) +#define sexp_opcode_num_args(x) (sexp_field(x, opcode, SEXP_OPCODE, num_args)) +#define sexp_opcode_flags(x) (sexp_field(x, opcode, SEXP_OPCODE, flags)) +#define sexp_opcode_inverse(x) (sexp_field(x, opcode, SEXP_OPCODE, inverse)) +#define sexp_opcode_dl(x) (sexp_field(x, opcode, SEXP_OPCODE, dl)) +#define sexp_opcode_name(x) (sexp_field(x, opcode, SEXP_OPCODE, name)) +#define sexp_opcode_data(x) (sexp_field(x, opcode, SEXP_OPCODE, data)) +#define sexp_opcode_data2(x) (sexp_field(x, opcode, SEXP_OPCODE, data2)) +#define sexp_opcode_proc(x) (sexp_field(x, opcode, SEXP_OPCODE, proc)) +#define sexp_opcode_return_type(x) (sexp_field(x, opcode, SEXP_OPCODE, ret_type)) +#define sexp_opcode_arg1_type(x) (sexp_field(x, opcode, SEXP_OPCODE, arg1_type)) +#define sexp_opcode_arg2_type(x) (sexp_field(x, opcode, SEXP_OPCODE, arg2_type)) +#define sexp_opcode_arg3_type(x) (sexp_field(x, opcode, SEXP_OPCODE, arg3_type)) +#define sexp_opcode_argn_type(x) (sexp_field(x, opcode, SEXP_OPCODE, argn_type)) +#define sexp_opcode_methods(x) (sexp_field(x, opcode, SEXP_OPCODE, methods)) +#define sexp_opcode_func(x) (sexp_field(x, opcode, SEXP_OPCODE, func)) + +#define sexp_opcode_variadic_p(x) (sexp_opcode_flags(x) & 1) +#define sexp_opcode_opt_param_p(x) (sexp_opcode_flags(x) & 2) +#define sexp_opcode_ref_trans_p(x) (sexp_opcode_flags(x) & 4) +#define sexp_opcode_static_param_p(x) (sexp_opcode_flags(x) & 8) + +#define sexp_lambda_name(x) (sexp_field(x, lambda, SEXP_LAMBDA, name)) +#define sexp_lambda_params(x) (sexp_field(x, lambda, SEXP_LAMBDA, params)) +#define sexp_lambda_locals(x) (sexp_field(x, lambda, SEXP_LAMBDA, locals)) +#define sexp_lambda_defs(x) (sexp_field(x, lambda, SEXP_LAMBDA, defs)) +#define sexp_lambda_flags(x) (sexp_field(x, lambda, SEXP_LAMBDA, flags)) +#define sexp_lambda_body(x) (sexp_field(x, lambda, SEXP_LAMBDA, body)) +#define sexp_lambda_fv(x) (sexp_field(x, lambda, SEXP_LAMBDA, fv)) +#define sexp_lambda_sv(x) (sexp_field(x, lambda, SEXP_LAMBDA, sv)) +#define sexp_lambda_return_type(x) (sexp_field(x, lambda, SEXP_LAMBDA, ret)) +#define sexp_lambda_param_types(x) (sexp_field(x, lambda, SEXP_LAMBDA, types)) +#define sexp_lambda_source(x) (sexp_field(x, lambda, SEXP_LAMBDA, source)) + +#define sexp_cnd_test(x) (sexp_field(x, cnd, SEXP_CND, test)) +#define sexp_cnd_pass(x) (sexp_field(x, cnd, SEXP_CND, pass)) +#define sexp_cnd_fail(x) (sexp_field(x, cnd, SEXP_CND, fail)) +#define sexp_cnd_source(x) (sexp_field(x, cnd, SEXP_CND, source)) + +#define sexp_set_var(x) (sexp_field(x, set, SEXP_SET, var)) +#define sexp_set_value(x) (sexp_field(x, set, SEXP_SET, value)) +#define sexp_set_source(x) (sexp_field(x, set, SEXP_SET, source)) + +#define sexp_ref_name(x) (sexp_field(x, ref, SEXP_REF, name)) +#define sexp_ref_cell(x) ((x)->value.ref.cell) +#define sexp_ref_loc(x) (sexp_cdr(sexp_ref_cell(x))) +#define sexp_ref_source(x) (sexp_field(x, ref, SEXP_REF, source)) + +#define sexp_seq_ls(x) (sexp_field(x, seq, SEXP_SEQ, ls)) +#define sexp_seq_source(x) (sexp_field(x, seq, SEXP_SEQ, source)) + +#define sexp_lit_value(x) (sexp_field(x, lit, SEXP_LIT, value)) +#define sexp_lit_source(x) (sexp_field(x, lit, SEXP_LIT, source)) + +#define sexp_stack_length(x) (sexp_field(x, stack, SEXP_STACK, length)) +#define sexp_stack_top(x) (sexp_field(x, stack, SEXP_STACK, top)) +#define sexp_stack_data(x) (sexp_field(x, stack, SEXP_STACK, data)) + +#define sexp_promise_donep(x) (sexp_field(x, promise, SEXP_PROMISE, donep)) +#define sexp_promise_thunk(x) (sexp_field(x, promise, SEXP_PROMISE, thunk)) +#define sexp_promise_value(x) (sexp_field(x, promise, SEXP_PROMISE, value)) + +#define sexp_context_env(x) (sexp_field(x, context, SEXP_CONTEXT, env)) +#define sexp_context_stack(x) (sexp_field(x, context, SEXP_CONTEXT, stack)) +#define sexp_context_depth(x) (sexp_field(x, context, SEXP_CONTEXT, depth)) +#define sexp_context_bc(x) (sexp_field(x, context, SEXP_CONTEXT, bc)) +#define sexp_context_fv(x) (sexp_field(x, context, SEXP_CONTEXT, fv)) +#define sexp_context_pos(x) (sexp_field(x, context, SEXP_CONTEXT, pos)) +#define sexp_context_lambda(x) (sexp_field(x, context, SEXP_CONTEXT, lambda)) +#define sexp_context_parent(x) (sexp_field(x, context, SEXP_CONTEXT, parent)) +#define sexp_context_child(x) (sexp_field(x, context, SEXP_CONTEXT, child)) +#define sexp_context_saves(x) (sexp_field(x, context, SEXP_CONTEXT, saves)) +#define sexp_context_tailp(x) (sexp_field(x, context, SEXP_CONTEXT, tailp)) +#define sexp_context_tracep(x) (sexp_field(x, context, SEXP_CONTEXT, tracep)) +#define sexp_context_globals(x) (sexp_field(x, context, SEXP_CONTEXT, globals)) +#define sexp_context_dk(x) (sexp_field(x, context, SEXP_CONTEXT, dk)) +#define sexp_context_params(x) (sexp_field(x, context, SEXP_CONTEXT, params)) +#define sexp_context_last_fp(x) (sexp_field(x, context, SEXP_CONTEXT, last_fp)) +#define sexp_context_refuel(x) (sexp_field(x, context, SEXP_CONTEXT, refuel)) +#define sexp_context_ip(x) (sexp_field(x, context, SEXP_CONTEXT, ip)) +#define sexp_context_proc(x) (sexp_field(x, context, SEXP_CONTEXT, proc)) +#define sexp_context_timeval(x) (sexp_field(x, context, SEXP_CONTEXT, tval)) +#define sexp_context_name(x) (sexp_field(x, context, SEXP_CONTEXT, name)) +#define sexp_context_specific(x) (sexp_field(x, context, SEXP_CONTEXT, specific)) +#define sexp_context_event(x) (sexp_field(x, context, SEXP_CONTEXT, event)) +#define sexp_context_timeoutp(x) (sexp_field(x, context, SEXP_CONTEXT, timeoutp)) +#define sexp_context_waitp(x) (sexp_field(x, context, SEXP_CONTEXT, waitp)) +#define sexp_context_dl(x) (sexp_field(x, context, SEXP_CONTEXT, dl)) + +#if SEXP_USE_ALIGNED_BYTECODE +#define sexp_context_align_pos(ctx) sexp_context_pos(ctx) = sexp_word_align(sexp_context_pos(ctx)) +#else +#define sexp_context_align_pos(ctx) +#endif + +#define sexp_global(ctx,x) (sexp_vector_data(sexp_context_globals(ctx))[x]) + +#if SEXP_USE_GLOBAL_HEAP +#if ! SEXP_USE_BOEHM +SEXP_API sexp_heap sexp_global_heap; +#endif +#define sexp_context_heap(ctx) sexp_global_heap +#define sexp_context_max_size(ctx) 0 +#else +#define sexp_context_heap(ctx) ((ctx)->value.context.heap) +#define sexp_context_max_size(ctx) sexp_context_heap(ctx)->max_size +#endif + +#if SEXP_USE_GLOBAL_SYMBOLS +#define sexp_context_symbols(ctx) sexp_symbol_table +#else +#define sexp_context_symbols(ctx) sexp_vector_data(sexp_global(ctx, SEXP_G_SYMBOLS)) +#endif + +#define sexp_context_types(ctx) sexp_vector_data(sexp_global(ctx, SEXP_G_TYPES)) +#define sexp_type_by_index(ctx,i) (sexp_context_types(ctx)[i]) +#define sexp_context_num_types(ctx) \ + sexp_unbox_fixnum(sexp_global(ctx, SEXP_G_NUM_TYPES)) +#define sexp_context_type_array_size(ctx) \ + sexp_vector_length(sexp_global(ctx, SEXP_G_TYPES)) + +#define sexp_object_type(ctx,x) (sexp_type_by_index(ctx, ((x)->tag))) +#define sexp_object_type_name(ctx,x) (sexp_type_name(sexp_object_type(ctx, x))) +#define sexp_type_name_by_index(ctx,i) (sexp_type_name(sexp_type_by_index(ctx,i))) + +#define sexp_type_size_of_object(t, x) \ + (((sexp_uint_t*)((char*)x + sexp_type_size_off(t)))[0] \ + * sexp_type_size_scale(t) \ + + sexp_type_size_base(t)) +#define sexp_type_num_slots_of_object(t, x) \ + (((sexp_uint_t*)((char*)x + sexp_type_field_len_off(t)))[0] \ + * sexp_type_field_len_scale(t) \ + + sexp_type_field_len_base(t)) +#define sexp_type_num_eq_slots_of_object(t, x) \ + (((sexp_uint_t*)((char*)x + sexp_type_field_len_off(t)))[0] \ + * sexp_type_field_len_scale(t) \ + + sexp_type_field_eq_len_base(t)) +#define sexp_type_num_weak_slots_of_object(t, x) \ + (((sexp_uint_t*)((char*)x + sexp_type_weak_len_off(t)))[0] \ + * sexp_type_weak_len_scale(t) \ + + sexp_type_weak_len_base(t)) + +#define sexp_context_top(x) (sexp_stack_top(sexp_context_stack(x))) + +#define sexp_type_tag(x) (sexp_field(x, type, SEXP_TYPE, tag)) +#define sexp_type_field_base(x) (sexp_field(x, type, SEXP_TYPE, field_base)) +#define sexp_type_field_eq_len_base(x) (sexp_field(x, type, SEXP_TYPE, field_eq_len_base)) +#define sexp_type_field_len_base(x) (sexp_field(x, type, SEXP_TYPE, field_len_base)) +#define sexp_type_field_len_off(x) (sexp_field(x, type, SEXP_TYPE, field_len_off)) +#define sexp_type_field_len_scale(x) (sexp_field(x, type, SEXP_TYPE, field_len_scale)) +#define sexp_type_size_base(x) (sexp_field(x, type, SEXP_TYPE, size_base)) +#define sexp_type_size_off(x) (sexp_field(x, type, SEXP_TYPE, size_off)) +#define sexp_type_size_scale(x) (sexp_field(x, type, SEXP_TYPE, size_scale)) +#define sexp_type_weak_base(x) (sexp_field(x, type, SEXP_TYPE, weak_base)) +#define sexp_type_weak_len_base(x) (sexp_field(x, type, SEXP_TYPE, weak_len_base)) +#define sexp_type_weak_len_off(x) (sexp_field(x, type, SEXP_TYPE, weak_len_off)) +#define sexp_type_weak_len_scale(x) (sexp_field(x, type, SEXP_TYPE, weak_len_scale)) +#define sexp_type_weak_len_extra(x) (sexp_field(x, type, SEXP_TYPE, weak_len_extra)) +#define sexp_type_depth(x) (sexp_field(x, type, SEXP_TYPE, depth)) +#define sexp_type_name(x) (sexp_field(x, type, SEXP_TYPE, name)) +#define sexp_type_cpl(x) (sexp_field(x, type, SEXP_TYPE, cpl)) +#define sexp_type_slots(x) (sexp_field(x, type, SEXP_TYPE, slots)) +#define sexp_type_finalize(x) (sexp_field(x, type, SEXP_TYPE, finalize)) +#define sexp_type_print(x) (sexp_field(x, type, SEXP_TYPE, print)) +#define sexp_type_dl(x) (sexp_field(x, type, SEXP_TYPE, dl)) +#define sexp_type_id(x) (sexp_field(x, type, SEXP_TYPE, id)) + +#define sexp_bignum_sign(x) (sexp_field(x, bignum, SEXP_BIGNUM, sign)) +#define sexp_bignum_length(x) (sexp_field(x, bignum, SEXP_BIGNUM, length)) +#define sexp_bignum_data(x) (sexp_field(x, bignum, SEXP_BIGNUM, data)) + +/****************************** arithmetic ****************************/ + +#define sexp_fx_add(a, b) ((sexp)(((sexp_sint_t)a)+((sexp_sint_t)b)-SEXP_FIXNUM_TAG)) +#define sexp_fx_sub(a, b) ((sexp)(((sexp_sint_t)a)-((sexp_sint_t)b)+SEXP_FIXNUM_TAG)) +#define sexp_fx_mul(a, b) ((sexp)((((((sexp_sint_t)a)-SEXP_FIXNUM_TAG)*(((sexp_sint_t)b)>>SEXP_FIXNUM_BITS))+SEXP_FIXNUM_TAG))) +#define sexp_fx_div(a, b) (sexp_make_fixnum(sexp_unbox_fixnum(a) / sexp_unbox_fixnum(b))) +#define sexp_fx_rem(a, b) (sexp_make_fixnum(sexp_unbox_fixnum(a) % sexp_unbox_fixnum(b))) +#define sexp_fx_sign(a) (+1 | (((sexp_sint_t)(a)) >> (sizeof(sexp_sint_t)*8 - 1))) +#define sexp_fx_neg(a) (sexp_make_fixnum(-(sexp_unbox_fixnum(a)))) +#define sexp_fx_abs(a) ((((sexp_sint_t)a) < 0) ? sexp_fx_neg(a) : a) + +#define sexp_fp_add(x,a,b) (sexp_make_flonum(x, sexp_flonum_value(a) + sexp_flonum_value(b))) +#define sexp_fp_sub(x,a,b) (sexp_make_flonum(x, sexp_flonum_value(a) - sexp_flonum_value(b))) +#define sexp_fp_mul(x,a,b) (sexp_make_flonum(x, sexp_flonum_value(a) * sexp_flonum_value(b))) +#define sexp_fp_div(x,a,b) (sexp_make_flonum(x, sexp_flonum_value(a) / sexp_flonum_value(b))) + +#if ! (SEXP_USE_FLONUMS || SEXP_USE_BIGNUMS) +#define sexp_add(ctx, a, b) sexp_fx_add(a, b) +#define sexp_sub(ctx, a, b) sexp_fx_sub(a, b) +#define sexp_mul(ctx, a, b) sexp_fx_mul(a, b) +#define sexp_div(ctx, a, b) sexp_fx_div(a, b) +#endif + +/****************************** utilities *****************************/ + +enum sexp_context_globals { +#if ! SEXP_USE_GLOBAL_SYMBOLS + SEXP_G_SYMBOLS, +#endif + SEXP_G_TYPES, + SEXP_G_NUM_TYPES, + SEXP_G_OOM_ERROR, /* out of memory exception object */ + SEXP_G_OOS_ERROR, /* out of stack exception object */ + SEXP_G_ABI_ERROR, /* incompatible ABI loading library */ + SEXP_G_OPTIMIZATIONS, + SEXP_G_SIGNAL_HANDLERS, + SEXP_G_META_ENV, + SEXP_G_MODULE_PATH, + SEXP_G_QUOTE_SYMBOL, + SEXP_G_QUASIQUOTE_SYMBOL, + SEXP_G_UNQUOTE_SYMBOL, + SEXP_G_UNQUOTE_SPLICING_SYMBOL, + SEXP_G_EMPTY_VECTOR, + SEXP_G_CUR_IN_SYMBOL, + SEXP_G_CUR_OUT_SYMBOL, + SEXP_G_CUR_ERR_SYMBOL, + SEXP_G_INTERACTION_ENV_SYMBOL, + SEXP_G_ERR_HANDLER, + SEXP_G_RESUMECC_BYTECODE, + SEXP_G_FINAL_RESUMER, +#if SEXP_USE_FOLD_CASE_SYMS + SEXP_G_FOLD_CASE_P, +#endif +#if SEXP_USE_WEAK_REFERENCES + SEXP_G_WEAK_REFERENCE_CACHE, +#endif +#if ! SEXP_USE_BOEHM + SEXP_G_PRESERVATIVES, +#endif +#if SEXP_USE_GREEN_THREADS + SEXP_G_IO_BLOCK_ERROR, + SEXP_G_THREADS_SCHEDULER, + SEXP_G_THREADS_FRONT, + SEXP_G_THREADS_BACK, + SEXP_G_THREADS_PAUSED, + SEXP_G_THREADS_SIGNALS, + SEXP_G_THREADS_SIGNAL_RUNNER, + SEXP_G_THREADS_POLL_FDS, + SEXP_G_THREADS_FD_THREADS, + SEXP_G_THREADS_BLOCKER, + SEXP_G_THREADS_MUTEX_ID, + SEXP_G_THREADS_POLLFDS_ID, +#endif + SEXP_G_NUM_GLOBALS +}; + +#define sexp_list1(x,a) sexp_cons((x), (a), SEXP_NULL) + +#define sexp_push(ctx, ls, x) ((ls) = sexp_cons((ctx), (x), (ls))) +#define sexp_insert(ctx, ls, x) ((sexp_memq(ctx, (x), (ls)) != SEXP_FALSE) ? (ls) : sexp_push((ctx), (ls), (x))) + +#define sexp_pair_source(x) (sexp_field(x, pair, SEXP_PAIR, source)) + +#define sexp_car(x) (sexp_field(x, pair, SEXP_PAIR, car)) +#define sexp_cdr(x) (sexp_field(x, pair, SEXP_PAIR, cdr)) + +#define sexp_caar(x) (sexp_car(sexp_car(x))) +#define sexp_cadr(x) (sexp_car(sexp_cdr(x))) +#define sexp_cdar(x) (sexp_cdr(sexp_car(x))) +#define sexp_cddr(x) (sexp_cdr(sexp_cdr(x))) +#define sexp_caaar(x) (sexp_car(sexp_caar(x))) +#define sexp_caadr(x) (sexp_car(sexp_cadr(x))) +#define sexp_cadar(x) (sexp_car(sexp_cdar(x))) +#define sexp_caddr(x) (sexp_car(sexp_cddr(x))) +#define sexp_cdaar(x) (sexp_cdr(sexp_caar(x))) +#define sexp_cdadr(x) (sexp_cdr(sexp_cadr(x))) +#define sexp_cddar(x) (sexp_cdr(sexp_cdar(x))) +#define sexp_cdddr(x) (sexp_cdr(sexp_cddr(x))) +#define sexp_cadddr(x) (sexp_cadr(sexp_cddr(x))) /* just these two */ +#define sexp_cddddr(x) (sexp_cddr(sexp_cddr(x))) + +/***************************** general API ****************************/ + +#if SEXP_USE_STRING_STREAMS + +#define sexp_read_char(x, p) (getc(sexp_port_stream(p))) +#define sexp_push_char(x, c, p) (ungetc(c, sexp_port_stream(p))) +#define sexp_write_char(x, c, p) (putc(c, sexp_port_stream(p))) +#define sexp_write_string(x, s, p) (fputs(s, sexp_port_stream(p))) +#define sexp_printf(x, p, ...) (fprintf(sexp_port_stream(p), __VA_ARGS__)) +#define sexp_flush(x, p) (fflush(sexp_port_stream(p))) + +#else + +#define sexp_read_char(x, p) (sexp_port_buf(p) ? ((sexp_port_offset(p) < sexp_port_size(p)) ? sexp_port_buf(p)[sexp_port_offset(p)++] : sexp_buffered_read_char(x, p)) : getc(sexp_port_stream(p))) +#define sexp_push_char(x, c, p) ((c!=EOF) && (sexp_port_buf(p) ? (sexp_port_buf(p)[--sexp_port_offset(p)] = ((char)(c))) : ungetc(c, sexp_port_stream(p)))) +#define sexp_write_char(x, c, p) (sexp_port_buf(p) ? ((sexp_port_offset(p) < sexp_port_size(p)) ? ((((sexp_port_buf(p))[sexp_port_offset(p)++]) = (char)(c)), 0) : sexp_buffered_write_char(x, c, p)) : putc(c, sexp_port_stream(p))) +#define sexp_write_string(x, s, p) (sexp_port_buf(p) ? sexp_buffered_write_string(x, s, p) : fputs(s, sexp_port_stream(p))) +#define sexp_flush(x, p) (sexp_port_buf(p) ? sexp_buffered_flush(x, p) : fflush(sexp_port_stream(p))) + +SEXP_API int sexp_buffered_read_char (sexp ctx, sexp p); +SEXP_API int sexp_buffered_write_char (sexp ctx, int c, sexp p); +SEXP_API int sexp_buffered_write_string_n (sexp ctx, const char *str, sexp_uint_t len, sexp p); +SEXP_API int sexp_buffered_write_string (sexp ctx, const char *str, sexp p); +SEXP_API int sexp_buffered_flush (sexp ctx, sexp p); + +#endif + +#define sexp_newline(ctx, p) sexp_write_char((ctx), '\n', (p)) +#define sexp_at_eofp(p) (feof(sexp_port_stream(p))) +#define sexp_port_fileno(p) (fileno(sexp_port_stream(p))) + +#if SEXP_USE_TRACK_ALLOC_SOURCE +#define sexp_current_source_param , const char* source +#else +#define sexp_current_source_param +#endif + +SEXP_API sexp sexp_alloc_tagged_aux(sexp ctx, size_t size, sexp_uint_t tag sexp_current_source_param); +SEXP_API sexp sexp_make_context(sexp ctx, size_t size, size_t max_size); +SEXP_API sexp sexp_cons_op(sexp ctx, sexp self, sexp_sint_t n, sexp head, sexp tail); +SEXP_API sexp sexp_list2(sexp ctx, sexp a, sexp b); +SEXP_API sexp sexp_equalp_bound (sexp ctx, sexp self, sexp_sint_t n, sexp a, sexp b, sexp bound); +SEXP_API sexp sexp_equalp_op (sexp ctx, sexp self, sexp_sint_t n, sexp a, sexp b); +SEXP_API sexp sexp_listp_op(sexp ctx, sexp self, sexp_sint_t n, sexp obj); +SEXP_API sexp sexp_reverse_op(sexp ctx, sexp self, sexp_sint_t n, sexp ls); +SEXP_API sexp sexp_nreverse_op(sexp ctx, sexp self, sexp_sint_t n, sexp ls); +SEXP_API sexp sexp_copy_list_op(sexp ctx, sexp self, sexp_sint_t n, sexp ls); +SEXP_API sexp sexp_append2_op(sexp ctx, sexp self, sexp_sint_t n, sexp a, sexp b); +SEXP_API sexp sexp_memq_op(sexp ctx, sexp self, sexp_sint_t n, sexp x, sexp ls); +SEXP_API sexp sexp_assq_op(sexp ctx, sexp self, sexp_sint_t n, sexp x, sexp ls); +SEXP_API sexp sexp_length_op(sexp ctx, sexp self, sexp_sint_t n, sexp ls); +SEXP_API sexp sexp_c_string(sexp ctx, const char *str, sexp_sint_t slen); +SEXP_API sexp sexp_make_bytes_op(sexp ctx, sexp self, sexp_sint_t n, sexp len, sexp i); +SEXP_API sexp sexp_make_string_op(sexp ctx, sexp self, sexp_sint_t n, sexp len, sexp ch); +SEXP_API sexp sexp_substring_op (sexp ctx, sexp self, sexp_sint_t n, sexp str, sexp start, sexp end); +SEXP_API sexp sexp_subbytes_op (sexp ctx, sexp self, sexp_sint_t n, sexp str, sexp start, sexp end); +SEXP_API sexp sexp_string_concatenate_op (sexp ctx, sexp self, sexp_sint_t n, sexp str_ls, sexp sep); +SEXP_API sexp sexp_intern (sexp ctx, const char *str, sexp_sint_t len); +SEXP_API sexp sexp_string_to_symbol_op (sexp ctx, sexp self, sexp_sint_t n, sexp str); +SEXP_API sexp sexp_symbol_to_string_op (sexp ctx, sexp self, sexp_sint_t n, sexp sym); +SEXP_API sexp sexp_string_to_number_op (sexp ctx, sexp self, sexp_sint_t n, sexp str, sexp b); +SEXP_API sexp sexp_flonump_op (sexp ctx, sexp self, sexp_sint_t n, sexp x); +SEXP_API sexp sexp_make_vector_op (sexp ctx, sexp self, sexp_sint_t n, sexp len, sexp dflt); +SEXP_API sexp sexp_list_to_vector_op (sexp ctx, sexp self, sexp_sint_t n, sexp ls); +SEXP_API sexp sexp_make_cpointer (sexp ctx, sexp_uint_t type_id, void* value, sexp parent, int freep); +SEXP_API sexp sexp_write_op (sexp ctx, sexp self, sexp_sint_t n, sexp obj, sexp out); +SEXP_API sexp sexp_display_op (sexp ctx, sexp self, sexp_sint_t n, sexp obj, sexp out); +SEXP_API sexp sexp_flush_output_op (sexp ctx, sexp self, sexp_sint_t n, sexp out); +SEXP_API sexp sexp_read_string (sexp ctx, sexp in, int sentinel); +SEXP_API sexp sexp_read_symbol (sexp ctx, sexp in, int init, int internp); +SEXP_API sexp sexp_read_number (sexp ctx, sexp in, int base); +#if SEXP_USE_COMPLEX +SEXP_API sexp sexp_read_complex_tail(sexp ctx, sexp in, sexp res); +#endif +SEXP_API sexp sexp_read_raw (sexp ctx, sexp in); +SEXP_API sexp sexp_read_op (sexp ctx, sexp self, sexp_sint_t n, sexp in); +SEXP_API sexp sexp_read_from_string (sexp ctx, const char *str, sexp_sint_t len); +SEXP_API sexp sexp_write_to_string (sexp ctx, sexp obj); +SEXP_API sexp sexp_write_simple_object (sexp ctx, sexp self, sexp_sint_t n, sexp obj, sexp writer, sexp out); +SEXP_API sexp sexp_finalize_port (sexp ctx, sexp self, sexp_sint_t n, sexp port); +SEXP_API sexp sexp_make_input_port (sexp ctx, FILE* in, sexp name); +SEXP_API sexp sexp_make_output_port (sexp ctx, FILE* out, sexp name); +SEXP_API sexp sexp_make_non_null_input_port (sexp ctx, FILE* in, sexp name); +SEXP_API sexp sexp_make_non_null_output_port (sexp ctx, FILE* out, sexp name); +SEXP_API sexp sexp_make_non_null_input_output_port (sexp ctx, FILE* io, sexp name); +SEXP_API sexp sexp_port_outputp_op (sexp ctx, sexp self, sexp_sint_t n, sexp port); +SEXP_API sexp sexp_port_binaryp_op (sexp ctx, sexp self, sexp_sint_t n, sexp port); +SEXP_API sexp sexp_port_openp_op (sexp ctx, sexp self, sexp_sint_t n, sexp port); +#if SEXP_USE_FOLD_CASE_SYMS +SEXP_API sexp sexp_get_port_fold_case (sexp ctx, sexp self, sexp_sint_t n, sexp in); +SEXP_API sexp sexp_set_port_fold_case (sexp ctx, sexp self, sexp_sint_t n, sexp in, sexp x); +#endif +#if SEXP_USE_OBJECT_BRACE_LITERALS +SEXP_API sexp sexp_lookup_type_op (sexp ctx, sexp self, sexp_sint_t n, sexp name, sexp id); +#endif +SEXP_API sexp sexp_make_input_string_port_op (sexp ctx, sexp self, sexp_sint_t n, sexp str); +SEXP_API sexp sexp_make_output_string_port_op (sexp ctx, sexp self, sexp_sint_t n); +SEXP_API sexp sexp_get_output_string_op (sexp ctx, sexp self, sexp_sint_t n, sexp port); +SEXP_API sexp sexp_make_exception (sexp ctx, sexp kind, sexp message, sexp irritants, sexp procedure, sexp source); +SEXP_API sexp sexp_user_exception (sexp ctx, sexp self, const char *msg, sexp x); +SEXP_API sexp sexp_type_exception (sexp ctx, sexp self, sexp_uint_t type_id, sexp x); +SEXP_API sexp sexp_xtype_exception (sexp ctx, sexp self, const char *msg, sexp x); +SEXP_API sexp sexp_range_exception (sexp ctx, sexp obj, sexp start, sexp end); +SEXP_API sexp sexp_print_exception_op (sexp ctx, sexp self, sexp_sint_t n, sexp exn, sexp out); +SEXP_API sexp sexp_stack_trace_op (sexp ctx, sexp self, sexp_sint_t n, sexp out); +SEXP_API sexp sexp_apply (sexp context, sexp proc, sexp args); +SEXP_API sexp sexp_apply1 (sexp ctx, sexp f, sexp x); +SEXP_API sexp sexp_make_foreign (sexp ctx, const char *name, int num_args, int flags, sexp_proc1 f, sexp data); +SEXP_API void sexp_init(void); + +#if SEXP_USE_UTF8_STRINGS +SEXP_API sexp sexp_string_index_to_offset (sexp ctx, sexp self, sexp_sint_t n, sexp str, sexp index); +SEXP_API sexp sexp_utf8_substring_op (sexp ctx, sexp self, sexp_sint_t n, sexp str, sexp start, sexp end); +SEXP_API void sexp_utf8_encode_char (unsigned char* p, int len, int c); +SEXP_API int sexp_write_utf8_char (sexp ctx, int c, sexp out); +#endif + +#if SEXP_USE_GREEN_THREADS +SEXP_API int sexp_maybe_block_port (sexp ctx, sexp in, int forcep); +SEXP_API void sexp_maybe_unblock_port (sexp ctx, sexp in); +#define sexp_check_block_port(ctx, in, forcep) \ + if (sexp_maybe_block_port(ctx, in, forcep)) \ + return sexp_global(ctx, SEXP_G_IO_BLOCK_ERROR) +#else +#define sexp_maybe_block_port(ctx, in, forcep) +#define sexp_maybe_unblock_port(ctx, in) +#define sexp_check_block_port(ctx, in, forcep) +#endif + +#define SEXP_PORT_UNKNOWN_FLAGS -1uL + +#define sexp_assert_type(ctx, pred, type_id, obj) if (! pred(obj)) return sexp_type_exception(ctx, self, type_id, obj) + +#define SEXP_COPY_DEFAULT SEXP_ZERO +#define SEXP_COPY_FREEP SEXP_ONE +#define SEXP_COPY_LOADP SEXP_TWO + +#if SEXP_USE_GLOBAL_HEAP +#define sexp_free_heap(heap) +#define sexp_destroy_context(ctx) +#else +SEXP_API void sexp_free_heap (sexp_heap heap); +SEXP_API void sexp_destroy_context (sexp ctx); +SEXP_API sexp sexp_copy_context (sexp ctx, sexp dst, sexp flags); +#endif + +#if SEXP_USE_SAFE_GC_MARK +SEXP_API int sexp_in_heap_p(sexp ctx, sexp x); +#else +#define sexp_in_heap_p(ctx, x) 1 +#endif + +#if SEXP_DEBUG_GC > 1 || SEXP_USE_SAFE_GC_MARK || SEXP_USE_HEADER_MAGIC +SEXP_API int sexp_valid_object_p(sexp ctx, sexp x); +#else +#define sexp_valid_object_p(ctx, x) 1 +#endif + +#if SEXP_USE_TYPE_DEFS +SEXP_API sexp sexp_register_type_op (sexp, sexp, sexp_sint_t, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp_proc2); +SEXP_API sexp sexp_register_simple_type_op (sexp ctx, sexp self, sexp_sint_t n, sexp name, sexp parent, sexp slots); +SEXP_API sexp sexp_finalize_c_type (sexp ctx, sexp self, sexp_sint_t n, sexp obj); +#define sexp_register_c_type(ctx, name, finalizer) \ + sexp_register_type(ctx, name, SEXP_FALSE, SEXP_FALSE, SEXP_ZERO, SEXP_ZERO, \ + SEXP_ZERO, SEXP_ZERO, SEXP_ZERO, \ + sexp_make_fixnum(sexp_sizeof(cpointer)), \ + SEXP_ZERO, SEXP_ZERO, SEXP_ZERO, SEXP_ZERO, \ + SEXP_ZERO, SEXP_ZERO, SEXP_ZERO, NULL, \ + (sexp_proc2)finalizer) +#endif + +#define sexp_current_error_port(ctx) sexp_parameter_ref(ctx, sexp_env_ref(sexp_context_env(ctx), sexp_global(ctx,SEXP_G_CUR_ERR_SYMBOL), SEXP_FALSE)) +#define sexp_debug(ctx, msg, obj) (sexp_write_string(ctx, msg, sexp_current_error_port(ctx)), sexp_write(ctx, obj, sexp_current_error_port(ctx)), sexp_write_char(ctx, '\n', sexp_current_error_port(ctx))) + +/* simplify primitive API interface */ + +#define sexp_read(ctx, in) sexp_read_op(ctx, NULL, 1, in) +#define sexp_write(ctx, obj, out) sexp_write_op(ctx, NULL, 2, obj, out) +#define sexp_display(ctx, obj, out) sexp_display_op(ctx, NULL, 2, obj, out) +#define sexp_print_exception(ctx, e, out) sexp_print_exception_op(ctx, NULL, 2, e, out) +#define sexp_flush_output(ctx, obj, out) sexp_flush_output_op(ctx, NULL, 1, out) +#define sexp_equalp(ctx, a, b) sexp_equalp_op(ctx, NULL, 2, a, b) +#define sexp_listp(ctx, x) sexp_listp_op(ctx, NULL, 1, x) +#define sexp_length(ctx, x) sexp_length_op(ctx, NULL, 1, x) +#define sexp_reverse(ctx, x) sexp_reverse_op(ctx, NULL, 1, x) +#define sexp_nreverse(ctx, x) sexp_nreverse_op(ctx, NULL, 1, x) +#define sexp_copy_list(ctx, x) sexp_copy_list_op(ctx, NULL, 1, x) +#define sexp_cons(ctx, a, b) sexp_cons_op(ctx, NULL, 2, a, b) +#define sexp_append2(ctx, a, b) sexp_append2_op(ctx, NULL, 2, a, b) +#define sexp_make_vector(ctx, a, b) sexp_make_vector_op(ctx, NULL, 2, a, b); +#define sexp_list_to_vector(ctx, x) sexp_list_to_vector_op(ctx, NULL, 1, x) +#define sexp_exception_type(ctx, x) sexp_exception_type_op(ctx, NULL, 1, x) +#define sexp_string_to_symbol(ctx, s) sexp_string_to_symbol_op(ctx, NULL, 1, s) +#define sexp_string_to_number(ctx, s, b) sexp_string_to_number_op(ctx, NULL, 2, s, b) +#define sexp_symbol_to_string(ctx, s) sexp_symbol_to_string_op(ctx, NULL, 1, s) +#define sexp_make_bytes(ctx, l, i) sexp_make_bytes_op(ctx, NULL, 2, l, i) +#define sexp_make_string(ctx, l, c) sexp_make_string_op(ctx, NULL, 2, l, c) +#define sexp_string_cmp(ctx, a, b, c) sexp_string_cmp_op(ctx, NULL, 3, a, b, c) +#define sexp_substring(ctx, a, b, c) sexp_substring_op(ctx, NULL, 3, a, b, c) +#define sexp_subbytes(ctx, a, b, c) sexp_subbytes_op(ctx, NULL, 3, a, b, c) +#define sexp_string_concatenate(ctx, ls, s) sexp_string_concatenate_op(ctx, NULL, 2, ls, s) +#define sexp_memq(ctx, a, b) sexp_memq_op(ctx, NULL, 2, a, b) +#define sexp_assq(ctx, a, b) sexp_assq_op(ctx, NULL, 2, a, b) +#define sexp_make_output_string_port(ctx) sexp_make_output_string_port_op(ctx, NULL, 0) +#define sexp_make_input_string_port(ctx, s) sexp_make_input_string_port_op(ctx, NULL, 1, s) +#define sexp_get_output_string(ctx, out) sexp_get_output_string_op(ctx, NULL, 1, out) +#define sexp_expt(ctx, a, b) sexp_expt_op(ctx, NULL, 2, a, b) +#define sexp_register_simple_type(ctx, a, b, c) sexp_register_simple_type_op(ctx, NULL, 3, a, b, c) +#define sexp_register_type(ctx, a, b, c, d, e, f, g, h, i, j, k, l, m, o, p, q, r, s) sexp_register_type_op(ctx, NULL, 18, a, b, c, d, e, f, g, h, i, j, k, l, m, o, p, q, r, s) +#define sexp_make_type_predicate(ctx, a, b) sexp_make_type_predicate_op(ctx, NULL, 2, a, b) +#define sexp_make_constructor(ctx, a, b) sexp_make_constructor_op(ctx, NULL, 2, a, b) +#define sexp_make_getter(ctx, a, b, c) sexp_make_getter_op(ctx, NULL, 3, a, b, c) +#define sexp_make_setter(ctx, a, b, c) sexp_make_setter_op(ctx, NULL, 3, a, b, c) +#define sexp_lookup_type(ctx, name, id) sexp_lookup_type_op(ctx, NULL, 2, name, id) + +enum sexp_opcode_names { + SEXP_OP_NOOP, + SEXP_OP_RAISE, + SEXP_OP_RESUMECC, + SEXP_OP_CALLCC, + SEXP_OP_APPLY1, + SEXP_OP_TAIL_CALL, + SEXP_OP_CALL, + SEXP_OP_FCALL0, + SEXP_OP_FCALL1, + SEXP_OP_FCALL2, + SEXP_OP_FCALL3, + SEXP_OP_FCALL4, + SEXP_OP_FCALLN, + SEXP_OP_JUMP_UNLESS, + SEXP_OP_JUMP, + SEXP_OP_PUSH, + SEXP_OP_RESERVE, + SEXP_OP_DROP, + SEXP_OP_GLOBAL_REF, + SEXP_OP_GLOBAL_KNOWN_REF, + SEXP_OP_PARAMETER_REF, + SEXP_OP_STACK_REF, + SEXP_OP_LOCAL_REF, + SEXP_OP_LOCAL_SET, + SEXP_OP_CLOSURE_REF, + SEXP_OP_CLOSURE_VARS, + SEXP_OP_VECTOR_REF, + SEXP_OP_VECTOR_SET, + SEXP_OP_VECTOR_LENGTH, + SEXP_OP_BYTES_REF, + SEXP_OP_BYTES_SET, + SEXP_OP_BYTES_LENGTH, + SEXP_OP_STRING_REF, + SEXP_OP_STRING_SET, + SEXP_OP_STRING_LENGTH, + SEXP_OP_STRING_CURSOR_NEXT, + SEXP_OP_STRING_CURSOR_PREV, + SEXP_OP_STRING_SIZE, + SEXP_OP_MAKE_PROCEDURE, + SEXP_OP_MAKE_VECTOR, + SEXP_OP_MAKE_EXCEPTION, + SEXP_OP_AND, + SEXP_OP_NULLP, + SEXP_OP_FIXNUMP, + SEXP_OP_SYMBOLP, + SEXP_OP_CHARP, + SEXP_OP_EOFP, + SEXP_OP_TYPEP, + SEXP_OP_MAKE, + SEXP_OP_SLOT_REF, + SEXP_OP_SLOT_SET, + SEXP_OP_ISA, + SEXP_OP_SLOTN_REF, + SEXP_OP_SLOTN_SET, + SEXP_OP_CAR, + SEXP_OP_CDR, + SEXP_OP_SET_CAR, + SEXP_OP_SET_CDR, + SEXP_OP_CONS, + SEXP_OP_ADD, + SEXP_OP_SUB, + SEXP_OP_MUL, + SEXP_OP_DIV, + SEXP_OP_QUOTIENT, + SEXP_OP_REMAINDER, + SEXP_OP_LT, + SEXP_OP_LE, + SEXP_OP_EQN, + SEXP_OP_EQ, + SEXP_OP_FIX2FLO, + SEXP_OP_FLO2FIX, + SEXP_OP_CHAR2INT, + SEXP_OP_INT2CHAR, + SEXP_OP_CHAR_UPCASE, + SEXP_OP_CHAR_DOWNCASE, + SEXP_OP_WRITE_CHAR, + SEXP_OP_WRITE_STRING, + SEXP_OP_READ_CHAR, + SEXP_OP_PEEK_CHAR, + SEXP_OP_YIELD, + SEXP_OP_FORCE, + SEXP_OP_RET, + SEXP_OP_DONE, + SEXP_OP_NUM_OPCODES +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ! SEXP_H */ diff --git a/lib/chibi/accept.c b/lib/chibi/accept.c new file mode 100644 index 00000000..9c8fa646 --- /dev/null +++ b/lib/chibi/accept.c @@ -0,0 +1,41 @@ + +/* chibi-ffi should probably be able to detect these patterns automatically, */ +/* but for now we manually check two special cases - accept should check for */ +/* EWOULDBLOCK and block on the socket, and listen should automatically make */ +/* sockets non-blocking. */ + +sexp sexp_accept (sexp ctx, sexp self, int sock, struct sockaddr* addr, socklen_t len) { +#if SEXP_USE_GREEN_THREADS + sexp f; +#endif + int res; + res = accept(sock, addr, &len); +#if SEXP_USE_GREEN_THREADS + if (res < 0 && errno == EWOULDBLOCK) { + f = sexp_global(ctx, SEXP_G_THREADS_BLOCKER); + if (sexp_opcodep(f)) { + ((sexp_proc2)sexp_opcode_func(f))(ctx, f, 1, sexp_make_fixnum(sock)); + return sexp_global(ctx, SEXP_G_IO_BLOCK_ERROR); + } + } +#endif + return sexp_make_integer(ctx, res); +} + +/* If we're listening on a socket from Scheme, we most likely want it */ +/* to be non-blocking. */ + +sexp sexp_listen (sexp ctx, sexp self, sexp arg0, sexp arg1) { + int fd, res; + if (! sexp_exact_integerp(arg0)) + return sexp_type_exception(ctx, self, SEXP_FIXNUM, arg0); + if (! sexp_exact_integerp(arg1)) + return sexp_type_exception(ctx, self, SEXP_FIXNUM, arg1); + fd = sexp_sint_value(arg0); + res = listen(fd, sexp_sint_value(arg1)); +#if SEXP_USE_GREEN_THREADS + if (res >= 0) + fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK); +#endif + return (res == 0) ? SEXP_TRUE : SEXP_FALSE; +} diff --git a/lib/chibi/ast.c b/lib/chibi/ast.c new file mode 100644 index 00000000..979c2cde --- /dev/null +++ b/lib/chibi/ast.c @@ -0,0 +1,483 @@ +/* ast.c -- interface to the Abstract Syntax Tree */ +/* Copyright (c) 2009-2011 Alex Shinn. All rights reserved. */ +/* BSD-style license: http://synthcode.com/license.txt */ + +#include + +#ifndef PLAN9 +#include +#endif + +#if ! SEXP_USE_BOEHM +extern sexp sexp_gc (sexp ctx, size_t *sum_freed); +#endif + +static void sexp_define_type_predicate (sexp ctx, sexp env, char *cname, sexp_uint_t type) { + sexp_gc_var2(name, op); + sexp_gc_preserve2(ctx, name, op); + name = sexp_c_string(ctx, cname, -1); + op = sexp_make_type_predicate(ctx, name, sexp_make_fixnum(type)); + sexp_env_define(ctx, env, name=sexp_intern(ctx, cname, -1), op); + sexp_gc_release2(ctx); +} + +static void sexp_define_accessors (sexp ctx, sexp env, sexp_uint_t ctype, + sexp_uint_t cindex, char* get, char *set) { + sexp type, index; + sexp_gc_var2(name, op); + sexp_gc_preserve2(ctx, name, op); + type = sexp_make_fixnum(ctype); + index = sexp_make_fixnum(cindex); + if (get) { + op = sexp_make_getter(ctx, name=sexp_c_string(ctx, get, -1), type, index); + sexp_env_define(ctx, env, name=sexp_intern(ctx, get, -1), op); + } + if (set) { + op = sexp_make_setter(ctx, name=sexp_c_string(ctx, set, -1), type, index); + sexp_env_define(ctx, env, name=sexp_intern(ctx, set, -1), op); + } + sexp_gc_release2(ctx); +} + +static sexp sexp_get_env_cell (sexp ctx, sexp self, sexp_sint_t n, sexp env, sexp id) { + sexp cell; + sexp_assert_type(ctx, sexp_envp, SEXP_ENV, env); + cell = sexp_env_cell(env, id, 0); + while ((! cell) && sexp_synclop(id)) { + env = sexp_synclo_env(id); + id = sexp_synclo_expr(id); + } + return cell ? cell : SEXP_FALSE; +} + +static sexp sexp_get_procedure_code (sexp ctx, sexp self, sexp_sint_t n, sexp proc) { + sexp_assert_type(ctx, sexp_procedurep, SEXP_PROCEDURE, proc); + return sexp_procedure_code(proc); +} + +static sexp sexp_get_procedure_vars (sexp ctx, sexp self, sexp_sint_t n, sexp proc) { + sexp_assert_type(ctx, sexp_procedurep, SEXP_PROCEDURE, proc); + return sexp_procedure_vars(proc); +} + +static sexp sexp_get_opcode_name (sexp ctx, sexp self, sexp_sint_t n, sexp op) { + if (! sexp_opcodep(op)) + return sexp_type_exception(ctx, self, SEXP_OPCODE, op); + else if (! sexp_opcode_name(op)) + return SEXP_FALSE; + else + return sexp_opcode_name(op); +} + +static sexp sexp_translate_opcode_type (sexp ctx, sexp type) { + sexp_gc_var2(res, tmp); + res = type; + if (! res) { + res = sexp_type_by_index(ctx, SEXP_OBJECT); + } if (sexp_fixnump(res)) { + res = sexp_type_by_index(ctx, sexp_unbox_fixnum(res)); + } else if (sexp_nullp(res)) { /* opcode list types */ + sexp_gc_preserve2(ctx, res, tmp); + tmp = sexp_intern(ctx, "or", -1); + res = sexp_cons(ctx, SEXP_NULL, SEXP_NULL); + res = sexp_cons(ctx, sexp_type_by_index(ctx, SEXP_PAIR), res); + res = sexp_cons(ctx, tmp, res); + sexp_gc_release2(ctx); + } + return res; +} + +static sexp sexp_get_opcode_ret_type (sexp ctx, sexp self, sexp_sint_t n, sexp op) { + sexp res; + if (!op) + return sexp_type_by_index(ctx, SEXP_OBJECT); + if (! sexp_opcodep(op)) + return sexp_type_exception(ctx, self, SEXP_OPCODE, op); + if (sexp_opcode_code(op) == SEXP_OP_RAISE) + return sexp_list1(ctx, sexp_intern(ctx, "error", -1)); + res = sexp_opcode_return_type(op); + if (sexp_fixnump(res)) + res = sexp_type_by_index(ctx, sexp_unbox_fixnum(res)); + return sexp_translate_opcode_type(ctx, res); +} + +static sexp sexp_get_opcode_param_type (sexp ctx, sexp self, sexp_sint_t n, sexp op, sexp k) { + sexp res; + int p = sexp_unbox_fixnum(k); + if (! sexp_opcodep(op)) + return sexp_type_exception(ctx, self, SEXP_OPCODE, op); + else if (! sexp_fixnump(k)) + return sexp_type_exception(ctx, self, SEXP_FIXNUM, k); + if (p > sexp_opcode_num_args(op) && sexp_opcode_variadic_p(op)) + p = sexp_opcode_num_args(op); + switch (p) { + case 0: + res = sexp_opcode_arg1_type(op); + break; + case 1: + res = sexp_opcode_arg2_type(op); + break; + default: + res = sexp_opcode_arg3_type(op); + if (res && sexp_vectorp(res)) { + if (sexp_vector_length(res) > (sexp_unbox_fixnum(k)-2)) + res = sexp_vector_ref(res, sexp_fx_sub(k, SEXP_TWO)); + else + res = sexp_type_by_index(ctx, SEXP_OBJECT); + } + break; + } + return sexp_translate_opcode_type(ctx, res); +} + +static sexp sexp_get_opcode_class (sexp ctx, sexp self, sexp_sint_t n, sexp op) { + sexp_assert_type(ctx, sexp_opcodep, SEXP_OPCODE, op); + return sexp_make_fixnum(sexp_opcode_class(op)); +} + +static sexp sexp_get_opcode_code (sexp ctx, sexp self, sexp_sint_t n, sexp op) { + sexp_assert_type(ctx, sexp_opcodep, SEXP_OPCODE, op); + return sexp_make_fixnum(sexp_opcode_code(op)); +} + +static sexp sexp_get_opcode_data (sexp ctx, sexp self, sexp_sint_t n, sexp op) { + sexp data; + sexp_assert_type(ctx, sexp_opcodep, SEXP_OPCODE, op); + data = sexp_opcode_data(op); + if (!data) return SEXP_VOID; + return sexp_opcode_class(op) == SEXP_OPC_TYPE_PREDICATE + && 0 <= sexp_unbox_fixnum(data) + && sexp_unbox_fixnum(data) <= sexp_context_num_types(ctx) ? + sexp_type_by_index(ctx, sexp_unbox_fixnum(data)) : data; +} + +static sexp sexp_get_opcode_num_params (sexp ctx, sexp self, sexp_sint_t n, sexp op) { + sexp_assert_type(ctx, sexp_opcodep, SEXP_OPCODE, op); + return sexp_make_fixnum(sexp_opcode_num_args(op)); +} + +static sexp sexp_get_opcode_variadic_p (sexp ctx, sexp self, sexp_sint_t n, sexp op) { + sexp_assert_type(ctx, sexp_opcodep, SEXP_OPCODE, op); + return sexp_make_boolean(sexp_opcode_variadic_p(op)); +} + +static sexp sexp_get_port_line (sexp ctx, sexp self, sexp_sint_t n, sexp p) { + sexp_assert_type(ctx, sexp_portp, SEXP_IPORT, p); + return sexp_make_fixnum(sexp_port_line(p)); +} + +static sexp sexp_set_port_line (sexp ctx, sexp self, sexp_sint_t n, sexp p, sexp i) { + sexp_assert_type(ctx, sexp_portp, SEXP_IPORT, p); + sexp_assert_type(ctx, sexp_fixnump, SEXP_FIXNUM, i); + sexp_port_line(p) = sexp_unbox_fixnum(i); + return SEXP_VOID; +} + +static sexp sexp_type_of (sexp ctx, sexp self, sexp_sint_t n, sexp x) { + if (sexp_pointerp(x)) + return sexp_object_type(ctx, x); + else if (sexp_fixnump(x)) + return sexp_type_by_index(ctx, SEXP_FIXNUM); + else if (sexp_booleanp(x)) + return sexp_type_by_index(ctx, SEXP_BOOLEAN); + else if (sexp_charp(x)) + return sexp_type_by_index(ctx, SEXP_CHAR); +#if SEXP_USE_HUFF_SYMS + else if (sexp_symbolp(x)) + return sexp_type_by_index(ctx, SEXP_SYMBOL); +#endif +#if SEXP_USE_IMMEDIATE_FLONUMS + else if (sexp_flonump(x)) + return sexp_type_by_index(ctx, SEXP_FLONUM); +#endif + else + return sexp_type_by_index(ctx, SEXP_OBJECT); +} + +static sexp sexp_env_parent_op (sexp ctx, sexp self, sexp_sint_t n, sexp e) { + sexp_assert_type(ctx, sexp_envp, SEXP_ENV, e); + return sexp_env_parent(e) ? sexp_env_parent(e) : SEXP_FALSE; +} + +static sexp sexp_type_name_op (sexp ctx, sexp self, sexp_sint_t n, sexp t) { + sexp_assert_type(ctx, sexp_typep, SEXP_TYPE, t); + return sexp_type_name(t); +} + +static sexp sexp_type_cpl_op (sexp ctx, sexp self, sexp_sint_t n, sexp t) { + sexp_assert_type(ctx, sexp_typep, SEXP_TYPE, t); + return sexp_type_cpl(t); +} + +static sexp sexp_type_slots_op (sexp ctx, sexp self, sexp_sint_t n, sexp t) { + sexp_assert_type(ctx, sexp_typep, SEXP_TYPE, t); + return sexp_type_slots(t); +} + +static sexp sexp_type_num_slots_op (sexp ctx, sexp self, sexp_sint_t n, sexp t) { + sexp_assert_type(ctx, sexp_typep, SEXP_TYPE, t); + return sexp_truep(sexp_type_slots(t)) ? sexp_length(ctx, sexp_type_slots(t)) + : sexp_make_fixnum(sexp_type_field_eq_len_base(t)); +} + +static sexp sexp_type_printer_op (sexp ctx, sexp self, sexp_sint_t n, sexp t) { + sexp_assert_type(ctx, sexp_typep, SEXP_TYPE, t); + return sexp_type_print(t) ? sexp_type_print(t) : SEXP_FALSE; +} + +static sexp sexp_object_size (sexp ctx, sexp self, sexp_sint_t n, sexp x) { + sexp t; + if ((! sexp_pointerp(x)) || (sexp_pointer_tag(x) >= sexp_context_num_types(ctx))) + return SEXP_ZERO; + t = sexp_object_type(ctx, x); + return sexp_make_fixnum(sexp_type_size_of_object(t, x)); +} + +static sexp sexp_integer_to_immediate (sexp ctx, sexp self, sexp_sint_t n, sexp i, sexp dflt) { + sexp x = (sexp)sexp_unbox_fixnum(i); + sexp_assert_type(ctx, sexp_fixnump, SEXP_FIXNUM, i); + if (sexp_pointerp(x)) + return dflt; + return x; +} + +static sexp sexp_make_lambda_op (sexp ctx, sexp self, sexp_sint_t n, sexp name, sexp params, sexp body, sexp locals) { + sexp res = sexp_alloc_type(ctx, lambda, SEXP_LAMBDA); + sexp_lambda_name(res) = name; + sexp_lambda_params(res) = params; + sexp_lambda_body(res) = body; + sexp_lambda_locals(res) = locals; + sexp_lambda_fv(res) = SEXP_NULL; + sexp_lambda_sv(res) = SEXP_NULL; + sexp_lambda_defs(res) = SEXP_NULL; + sexp_lambda_return_type(res) = SEXP_FALSE; + sexp_lambda_param_types(res) = SEXP_NULL; + return res; +} + +static sexp sexp_copy_lambda (sexp ctx, sexp self, sexp_sint_t n, sexp lambda) { + sexp res = sexp_alloc_type(ctx, lambda, SEXP_LAMBDA); + sexp_lambda_name(res) = sexp_lambda_name(lambda); + sexp_lambda_params(res) = sexp_lambda_params(lambda); + sexp_lambda_body(res) = sexp_lambda_body(lambda); + sexp_lambda_locals(res) = sexp_lambda_locals(lambda); + sexp_lambda_fv(res) = sexp_lambda_fv(lambda); + sexp_lambda_sv(res) = sexp_lambda_sv(lambda); + sexp_lambda_defs(res) = sexp_lambda_defs(lambda); + sexp_lambda_return_type(res) = sexp_lambda_return_type(lambda); + sexp_lambda_param_types(res) = sexp_lambda_param_types(lambda); + return res; +} + +static sexp sexp_make_set_op (sexp ctx, sexp self, sexp_sint_t n, sexp var, sexp value) { + sexp res = sexp_alloc_type(ctx, set, SEXP_SET); + sexp_set_var(res) = var; + sexp_set_value(res) = value; + return res; +} + +static sexp sexp_make_ref_op (sexp ctx, sexp self, sexp_sint_t n, sexp name, sexp cell) { + sexp res = sexp_alloc_type(ctx, ref, SEXP_REF); + sexp_ref_name(res) = name; + sexp_ref_cell(res) = cell; + return res; +} + +static sexp sexp_make_cnd_op (sexp ctx, sexp self, sexp_sint_t n, sexp test, sexp pass, sexp fail) { + sexp res = sexp_alloc_type(ctx, cnd, SEXP_CND); + sexp_cnd_test(res) = test; + sexp_cnd_pass(res) = pass; + sexp_cnd_fail(res) = fail; + return res; +} + +static sexp sexp_make_seq (sexp ctx, sexp self, sexp_sint_t n, sexp ls) { + sexp res = sexp_alloc_type(ctx, seq, SEXP_SEQ); + sexp_seq_ls(res) = ls; + return res; +} + +static sexp sexp_make_lit_op (sexp ctx, sexp self, sexp_sint_t n, sexp value) { + sexp res = sexp_alloc_type(ctx, lit, SEXP_LIT); + sexp_lit_value(res) = value; + return res; +} + +static sexp sexp_analyze_op (sexp ctx, sexp self, sexp_sint_t n, sexp x, sexp e) { + sexp ctx2 = ctx; + if (sexp_envp(e)) { + ctx2 = sexp_make_child_context(ctx, NULL); + sexp_context_env(ctx2) = e; + } + return sexp_analyze(ctx2, x); +} + +static sexp sexp_optimize (sexp ctx, sexp self, sexp_sint_t n, sexp x) { + sexp_gc_var2(ls, res); + sexp_gc_preserve2(ctx, ls, res); + res = x; + ls = sexp_global(ctx, SEXP_G_OPTIMIZATIONS); + for ( ; sexp_pairp(ls); ls=sexp_cdr(ls)) + res = sexp_apply1(ctx, sexp_cdar(ls), res); + sexp_free_vars(ctx, res, SEXP_NULL); + sexp_gc_release2(ctx); + return res; +} + +static sexp sexp_gc_op (sexp ctx, sexp self, sexp_sint_t n) { + size_t sum_freed=0; +#if SEXP_USE_BOEHM + GC_gcollect(); +#else + sexp_gc(ctx, &sum_freed); +#endif + return sexp_make_unsigned_integer(ctx, sum_freed); +} + +static sexp sexp_string_contains (sexp ctx, sexp self, sexp_sint_t n, sexp x, sexp y) { + const char *res; + sexp_assert_type(ctx, sexp_stringp, SEXP_STRING, x); + sexp_assert_type(ctx, sexp_stringp, SEXP_STRING, y); + res = strstr(sexp_string_data(x), sexp_string_data(y)); + return res ? sexp_make_fixnum(res-sexp_string_data(x)) : SEXP_FALSE; +} + +static sexp sexp_error_string (sexp ctx, sexp self, sexp_sint_t n, sexp x) { +#ifdef PLAN9 + return SEXP_FALSE; +#else + int err; + if (x == SEXP_FALSE) { + err = errno; + } else { + sexp_assert_type(ctx, sexp_fixnump, SEXP_FIXNUM, x); + err = sexp_unbox_fixnum(x); + } + return sexp_c_string(ctx, strerror(err), -1); +#endif +} + +static sexp sexp_update_free_vars (sexp ctx, sexp self, sexp_sint_t n, sexp x) { + return sexp_free_vars(ctx, x, SEXP_NULL); +} + +#define sexp_define_type(ctx, name, tag) \ + sexp_env_define(ctx, env, sexp_intern(ctx, name, -1), sexp_type_by_index(ctx, tag)); + +sexp sexp_init_library (sexp ctx, sexp self, sexp_sint_t n, sexp env, const char* version, sexp_abi_identifier_t abi) { + if (!(sexp_version_compatible(ctx, version, sexp_version) + && sexp_abi_compatible(ctx, abi, SEXP_ABI_IDENTIFIER))) + return sexp_global(ctx, SEXP_G_ABI_ERROR); + sexp_define_type(ctx, "Object", SEXP_OBJECT); + sexp_define_type(ctx, "Number", SEXP_NUMBER); + sexp_define_type(ctx, "Bignum", SEXP_BIGNUM); + sexp_define_type(ctx, "Flonum", SEXP_FLONUM); + sexp_define_type(ctx, "Integer", SEXP_FIXNUM); + sexp_define_type(ctx, "Symbol", SEXP_SYMBOL); + sexp_define_type(ctx, "Char", SEXP_CHAR); + sexp_define_type(ctx, "Boolean", SEXP_BOOLEAN); + sexp_define_type(ctx, "String", SEXP_STRING); + sexp_define_type(ctx, "Byte-Vector", SEXP_BYTES); + sexp_define_type(ctx, "Pair", SEXP_PAIR); + sexp_define_type(ctx, "Vector", SEXP_VECTOR); + sexp_define_type(ctx, "Input-Port", SEXP_IPORT); + sexp_define_type(ctx, "Output-Port", SEXP_OPORT); + sexp_define_type(ctx, "Opcode", SEXP_OPCODE); + sexp_define_type(ctx, "Procedure", SEXP_PROCEDURE); + sexp_define_type(ctx, "Bytecode", SEXP_BYTECODE); + sexp_define_type(ctx, "Env", SEXP_ENV); + sexp_define_type(ctx, "Macro", SEXP_MACRO); + sexp_define_type(ctx, "Lam", SEXP_LAMBDA); + sexp_define_type(ctx, "Cnd", SEXP_CND); + sexp_define_type(ctx, "Set", SEXP_SET); + sexp_define_type(ctx, "Ref", SEXP_REF); + sexp_define_type(ctx, "Seq", SEXP_SEQ); + sexp_define_type(ctx, "Lit", SEXP_LIT); + sexp_define_type(ctx, "Sc", SEXP_SYNCLO); + sexp_define_type(ctx, "Context", SEXP_CONTEXT); + sexp_define_type(ctx, "Exception", SEXP_EXCEPTION); + sexp_define_type_predicate(ctx, env, "environment?", SEXP_ENV); + sexp_define_type_predicate(ctx, env, "bytecode?", SEXP_BYTECODE); + sexp_define_type_predicate(ctx, env, "macro?", SEXP_MACRO); + sexp_define_type_predicate(ctx, env, "syntactic-closure?", SEXP_SYNCLO); + sexp_define_type_predicate(ctx, env, "lambda?", SEXP_LAMBDA); + sexp_define_type_predicate(ctx, env, "cnd?", SEXP_CND); + sexp_define_type_predicate(ctx, env, "set?", SEXP_SET); + sexp_define_type_predicate(ctx, env, "ref?", SEXP_REF); + sexp_define_type_predicate(ctx, env, "seq?", SEXP_SEQ); + sexp_define_type_predicate(ctx, env, "lit?", SEXP_LIT); + sexp_define_type_predicate(ctx, env, "opcode?", SEXP_OPCODE); + sexp_define_type_predicate(ctx, env, "type?", SEXP_TYPE); + sexp_define_type_predicate(ctx, env, "context?", SEXP_CONTEXT); + sexp_define_type_predicate(ctx, env, "exception?", SEXP_EXCEPTION); + sexp_define_accessors(ctx, env, SEXP_PAIR, 2, "pair-source", "pair-source-set!"); + sexp_define_accessors(ctx, env, SEXP_SYNCLO, 0, "syntactic-closure-env", NULL); + sexp_define_accessors(ctx, env, SEXP_SYNCLO, 1, "syntactic-closure-vars", NULL); + sexp_define_accessors(ctx, env, SEXP_SYNCLO, 2, "syntactic-closure-expr", NULL); + sexp_define_accessors(ctx, env, SEXP_LAMBDA, 0, "lambda-name", "lambda-name-set!"); + sexp_define_accessors(ctx, env, SEXP_LAMBDA, 1, "lambda-params", "lambda-params-set!"); + sexp_define_accessors(ctx, env, SEXP_LAMBDA, 2, "lambda-body", "lambda-body-set!"); + sexp_define_accessors(ctx, env, SEXP_LAMBDA, 3, "lambda-defs", "lambda-defs-set!"); + sexp_define_accessors(ctx, env, SEXP_LAMBDA, 4, "lambda-locals", "lambda-locals-set!"); + sexp_define_accessors(ctx, env, SEXP_LAMBDA, 5, "lambda-flags", "lambda-flags-set!"); + sexp_define_accessors(ctx, env, SEXP_LAMBDA, 6, "lambda-free-vars", "lambda-free-vars-set!"); + sexp_define_accessors(ctx, env, SEXP_LAMBDA, 7, "lambda-set-vars", "lambda-set-vars-set!"); + sexp_define_accessors(ctx, env, SEXP_LAMBDA, 8, "lambda-return-type", "lambda-return-type-set!"); + sexp_define_accessors(ctx, env, SEXP_LAMBDA, 9, "lambda-param-types", "lambda-param-types-set!"); + sexp_define_accessors(ctx, env, SEXP_LAMBDA, 10, "lambda-source", "lambda-source-set!"); + sexp_define_accessors(ctx, env, SEXP_CND, 0, "cnd-test", "cnd-test-set!"); + sexp_define_accessors(ctx, env, SEXP_CND, 1, "cnd-pass", "cnd-pass-set!"); + sexp_define_accessors(ctx, env, SEXP_CND, 2, "cnd-fail", "cnd-fail-set!"); + sexp_define_accessors(ctx, env, SEXP_SET, 0, "set-var", "set-var-set!"); + sexp_define_accessors(ctx, env, SEXP_SET, 1, "set-value", "set-value-set!"); + sexp_define_accessors(ctx, env, SEXP_REF, 0, "ref-name", "ref-name-set!"); + sexp_define_accessors(ctx, env, SEXP_REF, 1, "ref-cell", "ref-cell-set!"); + sexp_define_accessors(ctx, env, SEXP_SEQ, 0, "seq-ls", "seq-ls-set!"); + sexp_define_accessors(ctx, env, SEXP_LIT, 0, "lit-value", "lit-value-set!"); + sexp_define_accessors(ctx, env, SEXP_BYTECODE, 1, "bytecode-name", "bytecode-name-set!"); + sexp_define_accessors(ctx, env, SEXP_BYTECODE, 2, "bytecode-literals", NULL); + sexp_define_accessors(ctx, env, SEXP_BYTECODE, 3, "bytecode-source", NULL); + sexp_define_accessors(ctx, env, SEXP_EXCEPTION, 0, "exception-kind", NULL); + sexp_define_accessors(ctx, env, SEXP_EXCEPTION, 1, "exception-message", NULL); + sexp_define_accessors(ctx, env, SEXP_EXCEPTION, 2, "exception-irritants", NULL); + sexp_define_accessors(ctx, env, SEXP_MACRO, 0, "macro-procedure", NULL); + sexp_define_accessors(ctx, env, SEXP_MACRO, 1, "macro-env", NULL); + sexp_define_accessors(ctx, env, SEXP_MACRO, 2, "macro-source", NULL); + sexp_define_foreign(ctx, env, "procedure-code", 1, sexp_get_procedure_code); + sexp_define_foreign(ctx, env, "procedure-vars", 1, sexp_get_procedure_vars); + sexp_define_foreign(ctx, env, "copy-lambda", 1, sexp_copy_lambda); + sexp_define_foreign_opt(ctx, env, "make-lambda", 4, sexp_make_lambda_op, SEXP_NULL); + sexp_define_foreign_opt(ctx, env, "make-cnd", 3, sexp_make_cnd_op, SEXP_VOID); + sexp_define_foreign(ctx, env, "make-ref", 2, sexp_make_ref_op); + sexp_define_foreign(ctx, env, "make-set", 2, sexp_make_set_op); + sexp_define_foreign(ctx, env, "make-lit", 1, sexp_make_lit_op); + sexp_define_foreign(ctx, env, "make-seq", 1, sexp_make_seq); + sexp_define_foreign_opt(ctx, env, "analyze", 2, sexp_analyze_op, SEXP_FALSE); + sexp_define_foreign(ctx, env, "optimize", 1, sexp_optimize); + sexp_define_foreign(ctx, env, "extend-env", 2, sexp_extend_env); + sexp_define_foreign(ctx, env, "env-cell", 2, sexp_get_env_cell); + sexp_define_foreign(ctx, env, "opcode-name", 1, sexp_get_opcode_name); + sexp_define_foreign(ctx, env, "opcode-class", 1, sexp_get_opcode_class); + sexp_define_foreign(ctx, env, "opcode-code", 1, sexp_get_opcode_code); + sexp_define_foreign(ctx, env, "opcode-data", 1, sexp_get_opcode_data); + sexp_define_foreign(ctx, env, "opcode-variadic?", 1, sexp_get_opcode_variadic_p); + sexp_define_foreign(ctx, env, "opcode-num-params", 1, sexp_get_opcode_num_params); + sexp_define_foreign(ctx, env, "opcode-return-type", 1, sexp_get_opcode_ret_type); + sexp_define_foreign(ctx, env, "opcode-param-type", 2, sexp_get_opcode_param_type); + sexp_define_foreign(ctx, env, "port-line", 1, sexp_get_port_line); + sexp_define_foreign(ctx, env, "port-line-set!", 2, sexp_set_port_line); + sexp_define_foreign(ctx, env, "type-of", 1, sexp_type_of); + sexp_define_foreign(ctx, env, "type-name", 1, sexp_type_name_op); + sexp_define_foreign(ctx, env, "type-cpl", 1, sexp_type_cpl_op); + sexp_define_foreign(ctx, env, "type-slots", 1, sexp_type_slots_op); + sexp_define_foreign(ctx, env, "type-num-slots", 1, sexp_type_num_slots_op); + sexp_define_foreign(ctx, env, "type-printer", 1, sexp_type_printer_op); + sexp_define_foreign(ctx, env, "environment-parent", 1, sexp_env_parent_op); + sexp_define_foreign(ctx, env, "object-size", 1, sexp_object_size); + sexp_define_foreign_opt(ctx, env, "integer->immediate", 2, sexp_integer_to_immediate, SEXP_FALSE); + sexp_define_foreign(ctx, env, "gc", 0, sexp_gc_op); + sexp_define_foreign(ctx, env, "string-contains", 2, sexp_string_contains); + sexp_define_foreign_opt(ctx, env, "integer->error-string", 1, sexp_error_string, SEXP_FALSE); + sexp_define_foreign(ctx, env, "update-free-vars!", 1, sexp_update_free_vars); + return SEXP_VOID; +} diff --git a/lib/chibi/ast.scm b/lib/chibi/ast.scm new file mode 100644 index 00000000..99f5975f --- /dev/null +++ b/lib/chibi/ast.scm @@ -0,0 +1,357 @@ +;; ast.scm -- ast utilities +;; Copyright (c) 2010-2011 Alex Shinn. All rights reserved. +;; BSD-style license: http://synthcode.com/license.txt + +;;> Abstract Syntax Tree. Interface to the types used by +;;> the compiler, and other core types less commonly +;;> needed in user code, plus related utilities. + +;;> @subsubsection{Analysis and Expansion} + +;;> @subsubsubsection{@scheme{(analyze x [env])}} + +;;> Expands and analyzes the expression @var{x} and returns the +;;> resulting AST. + +;;> @subsubsubsection{@scheme{(optimize ast)}} + +;;> Runs an optimization pass on @var{ast} and returns the +;;> resulting simplified expression. + +(define (ast-renames ast) + (define i 0) + (define renames '()) + (define (rename-symbol id) + (set! i (+ i 1)) + (string->symbol + (string-append (symbol->string (identifier->symbol id)) + "." (number->string i)))) + (define (rename-lambda lam) + (or (assq lam renames) + (let ((res (list lam))) + (set! renames (cons res renames)) + res))) + (define (rename! id lam) + (let ((cell (rename-lambda lam))) + (set-cdr! cell (cons (cons id (rename-symbol id)) (cdr cell))))) + (define (check-ref id lam env) + (let ((sym (identifier->symbol id))) + (let lp1 ((ls env)) + (cond + ((pair? ls) + (let lp2 ((ls2 (car ls)) (found? #f)) + (cond + ((null? ls2) + (if (not found?) (lp1 (cdr ls)))) + ((and (eq? id (caar ls2)) (eq? lam (cdar ls2))) + (lp2 (cdr ls2) #t)) + ((eq? sym (identifier->symbol (caar ls2))) + (rename! (caar ls2) (cdar ls2)) + (lp2 (cdr ls2) found?)) + (else + (lp2 (cdr ls2) found?))))))))) + (define (extend-env lam env) + (cons (map (lambda (x) (cons x lam)) (flatten-dot (lambda-params lam))) env)) + (let lp ((x ast) (env '())) + (cond + ((lambda? x) (lp (lambda-body x) (extend-env x env))) + ((ref? x) (check-ref (ref-name x) (cdr (ref-cell x)) env)) + ((cnd? x) (lp (cnd-test x) env) (lp (cnd-pass x) env) (lp (cnd-fail x) env)) + ((set? x) (lp (set-var x) env) (lp (set-value x) env)) + ((seq? x) (for-each (lambda (x) (lp x env)) (seq-ls x))) + ((pair? x) (for-each (lambda (x) (lp x env)) x)))) + renames) + +(define (flatten-dot x) + (cond ((pair? x) (cons (car x) (flatten-dot (cdr x)))) + ((null? x) x) + (else (list x)))) + +(define (get-rename id lam renames) + (let ((ls (assq lam renames))) + (if (not ls) + (identifier->symbol id) + (cond ((assq id (cdr ls)) => cdr) (else (identifier->symbol id)))))) + +(define (map* f ls) + (cond ((pair? ls) (cons (f (car ls)) (map* f (cdr ls)))) + ((null? ls) '()) + (else (f ls)))) + +;;> Performs a full syntax expansion of the form @var{x} and +;;> returns the resulting s-expression. + +(define (macroexpand x) + (ast->sexp (analyze x))) + +;;> Convert @var{ast} to a s-expression, renaming variables if +;;> necessary. + +(define (ast->sexp ast) + (let ((renames (ast-renames ast))) + (let a2s ((x ast)) + (cond + ((lambda? x) + `(lambda ,(map* (lambda (id) (get-rename id x renames)) (lambda-params x)) + ,@(map (lambda (d) `(define ,(identifier->symbol (caar d)) #f)) + (lambda-defs x)) + ,@(if (seq? (lambda-body x)) + (map a2s (seq-ls (lambda-body x))) + (list (a2s (lambda-body x)))))) + ((cnd? x) `(if ,(a2s (cnd-test x)) ,(a2s (cnd-pass x)) ,(a2s (cnd-fail x)))) + ((set? x) `(set! ,(a2s (set-var x)) ,(a2s (set-value x)))) + ((ref? x) (get-rename (ref-name x) (cdr (ref-cell x)) renames)) + ((seq? x) `(begin ,@(map a2s (seq-ls x)))) + ((lit? x) + (let ((v (lit-value x))) + (if (or (pair? v) (null? v) (symbol? v)) `',v v))) + ((pair? x) (cons (a2s (car x)) (a2s (cdr x)))) + ((opcode? x) (cond ((opcode-name x) => string->symbol) (else x))) + (else x))))) + +;;> @subsubsection{Types} + +;;> All objects have an associated type, and types may have parent +;;> types. When using +;;> @hyperlink["http://srfi.schemers.org/srfi-9/srfi-9/html"]{SRFI-9} +;;> @scheme{define-record-type}, the name is bound to a first class +;;> type object. + +;;> The following core types are also available by name, and may be +;;> used in the @scheme{match} @scheme{($ ...)} syntax. + +;;> @itemlist[ +;;> @item{@scheme{} - the parent of all types} +;;> @item{@scheme{} - abstract numeric type} +;;> @item{@scheme{} - arbitrary precision exact integers} +;;> @item{@scheme{} - inexact real numbers} +;;> @item{@scheme{} - abstract integer type} +;;> @item{@scheme{} - symbols} +;;> @item{@scheme{} - character} +;;> @item{@scheme{} - @scheme{#t} or @scheme{#f}} +;;> @item{@scheme{} - strings of characters} +;;> @item{@scheme{} - uniform vector of octets} +;;> @item{@scheme{} - a @var{car} and @var{cdr}, the basis for lists} +;;> @item{@scheme{} - vectors} +;;> @item{@scheme{} - a primitive opcode or C function} +;;> @item{@scheme{} - a closure} +;;> @item{@scheme{} - the compiled code for a closure} +;;> @item{@scheme{} - an environment structure} +;;> @item{@scheme{} - a macro object, usually not first-class} +;;> @item{@scheme{} - a lambda AST type} +;;> @item{@scheme{} - an conditional AST type (i.e. @scheme{if})} +;;> @item{@scheme{} - a reference AST type} +;;> @item{@scheme{} - a mutation AST type (i.e. @scheme{set!})} +;;> @item{@scheme{} - a sequence AST type} +;;> @item{@scheme{} - a literal AST type} +;;> @item{@scheme{} - a syntactic closure} +;;> @item{@scheme{} - a context object (including threads)} +;;> @item{@scheme{} - an exception object} +;;> ] + +;;> The following extended type predicates may also be used to test +;;> individual objects for their type: + +;;> @itemlist[ +;;> @item{@scheme{environment?}} +;;> @item{@scheme{bytecode?}} +;;> @item{@scheme{macro?}} +;;> @item{@scheme{syntactic-closure?}} +;;> @item{@scheme{lambda?}} +;;> @item{@scheme{cnd?}} +;;> @item{@scheme{ref?}} +;;> @item{@scheme{set?}} +;;> @item{@scheme{seq?}} +;;> @item{@scheme{lit?}} +;;> @item{@scheme{opcode?}} +;;> @item{@scheme{type?}} +;;> @item{@scheme{context?}} +;;> @item{@scheme{exception?}} +;;> ] + +;;> @subsubsubsection{@scheme{(type-of x)}} + +;;> Returns the type of any object @var{x}. + +;;> @subsubsubsection{@scheme{(type-name type)}} + +;;> Returns the name of type @var{type}. + +;;> @subsubsubsection{@scheme{(type-parent type)}} + +;;> Returns the immediate parent of type @var{type}, +;;> or @scheme{#f} for a type with no parent. + +(define (type-parent type) + (let ((v (type-cpl type))) + (and (vector? v) + (> (vector-length v) 1) + (vector-ref v (- (vector-length v) 2))))) + +;;> @subsubsubsection{@scheme{(type-cpl type)}} + +;;> Returns the class precedence list of type @var{type} as a +;;> vector, or @scheme{#f} for a type with no parent. + +;;> @subsubsubsection{@scheme{(type-slots type)}} + +;;> Returns the slot list of type @var{type}. + +;;> @subsubsection{Accessors} + +;;> This section describes additional accessors on AST and other core +;;> types. + +;;> @subsubsubsection{Procedures} + +;;> @itemlist[ +;;> @item{@scheme{(procedure-code f)} - the compiled bytecode object} +;;> @item{@scheme{(procedure-vars f)} - the variables closed over by @var{f}} +;;> @item{@scheme{(procedure-name f)} - the name of @var{f} if known, else @scheme{#f}} +;;> ] + +(define (procedure-name x) + (bytecode-name (procedure-code x))) + +(define (procedure-name-set! x name) + (bytecode-name-set! (procedure-code x) name)) + +;;> @subsubsubsection{Macros} + +;;> @itemlist[ +;;> @item{@scheme{(macro-procedure f)} - the macro procedure} +;;> @item{@scheme{(macro-env f)} - the environment the macro was defined in} +;;> @item{@scheme{(macro-source f)} - the source location the macro was defined in} +;;> ] + +;;> @subsubsubsection{Bytecode Objects} + +;;> @itemlist[ +;;> @item{@scheme{(bytecode-name bc)} - the macro procedure} +;;> @item{@scheme{(bytecode-literals bc)} - literals the bytecode references} +;;> @item{@scheme{(bytecode-source bc)} - the source location the procedure was defined in} +;;> ] + +;;> @subsubsubsection{Syntactic Closures} + +;;> @itemlist[ +;;> @item{@scheme{(syntactic-closure-env sc)}} +;;> @item{@scheme{(syntactic-closure-vars sc)}} +;;> @item{@scheme{(syntactic-closure-expr sc)}} +;;> ] + +;;> Return the environment, free variables, and expression +;;> associated with @var{sc} respectively. + +;;> @subsubsubsection{Exceptions} + +;;> @itemlist[ +;;> @item{@scheme{(exception-kind exn)}} +;;> @item{@scheme{(exception-message exn)}} +;;> @item{@scheme{(exception-irritants exn)}} +;;> ] + +;;> Return the kind, message, and irritants +;;> associated with @var{exn} respectively. + +;;> @subsubsubsection{Lambdas} + +;;> @itemlist[ +;;> @item{@scheme{(lambda-name lam)} - the name of the lambda, if known} +;;> @item{@scheme{(lambda-name-set! lam x)}} +;;> @item{@scheme{(lambda-params lam)} - the lambda parameter list} +;;> @item{@scheme{(lambda-params-set! lam x)}} +;;> @item{@scheme{(lambda-body lam)} - the body of the lambda} +;;> @item{@scheme{(lambda-body-set! lam x)}} +;;> @item{@scheme{(lambda-defs lam)} - internal definitions of the lambda} +;;> @item{@scheme{(lambda-defs-set! lam x)}} +;;> @item{@scheme{(lambda-locals lam)} - local variables as a list of identifiers} +;;> @item{@scheme{(lambda-locals-set! lam x)}} +;;> @item{@scheme{(lambda-flags lam)} - various flags describing the lambda} +;;> @item{@scheme{(lambda-flags-set! lam x)}} +;;> @item{@scheme{(lambda-free-vars lam)} - free variables the lambda will need to close over} +;;> @item{@scheme{(lambda-free-vars-set! lam x)}} +;;> @item{@scheme{(lambda-set-vars lam)} - variables the lambda mutates} +;;> @item{@scheme{(lambda-set-vars-set! lam x)}} +;;> @item{@scheme{(lambda-return-type lam)} - the return type of the lambda} +;;> @item{@scheme{(lambda-return-type-set! lam x)}} +;;> @item{@scheme{(lambda-param-types lam)} - the types of the input parameters} +;;> @item{@scheme{(lambda-param-types-set! lam x)}} +;;> @item{@scheme{(lambda-source lam)} - the source code of the lambda} +;;> @item{@scheme{(lambda-source-set! lam x)}} +;;> ] + +;;> @subsubsubsection{Conditionals} + +;;> @itemlist[ +;;> @item{@scheme{(cnd-test cnd)} - the test for the conditional} +;;> @item{@scheme{(cnd-test-set! cnd x)}} +;;> @item{@scheme{(cnd-pass cnd)} - the success branch} +;;> @item{@scheme{(cnd-pass-set! cnd x)}} +;;> @item{@scheme{(cnd-fail cnd)} - the failure branch} +;;> @item{@scheme{(cnd-fail-set! cnd x)}} +;;> ] + +;;> @subsubsubsection{Sequences} + +;;> @itemlist[ +;;> @item{@scheme{(seq-ls seq)} - the list of sequence expressions} +;;> @item{@scheme{(seq-ls-set! seq x)}} +;;> ] + +;;> @subsubsubsection{References} + +;;> @itemlist[ +;;> @item{@scheme{(ref-name ref)} - the name of the referenced variable} +;;> @item{@scheme{(ref-name-set! ref x)}} +;;> @item{@scheme{(ref-cell ref)} - the environment cell the reference resolves to} +;;> @item{@scheme{(ref-cell-set! ref x)}} +;;> ] + +;;> @subsubsubsection{Mutations} + +;;> @itemlist[ +;;> @item{@scheme{(set-var set)} - a reference to the mutated variable} +;;> @item{@scheme{(set-var-set! set x)}} +;;> @item{@scheme{(set-value set)} - the value to set the variable to} +;;> @item{@scheme{(set-value-set! set x)}} +;;> ] + +;;> @subsubsubsection{Literals} + +;;> @itemlist[ +;;> @item{@scheme{(lit-value lit)} - the literal value} +;;> @item{@scheme{(lit-value-set! lit x)}} +;;> ] + +;;> @subsubsubsection{Pairs} + +;;> @itemlist[ +;;> @item{@scheme{(pair-source x)}} +;;> @item{@scheme{(pair-source-set! x source)}} +;;> ] + +;;> Set or return the source code info associated with a pair x. +;;> Source info is represented as another pair whose @var{car} is +;;> the source file name and whose @var{cdr} is the line number. + +;;> @subsubsection{Miscellaneous Utilities} + +;;> @subsubsubsection{@scheme{(gc)}} + +;;> Force a garbage collection. + +;;> @subsubsubsection{@scheme{(object-size x)}} + +;;> Returns the heap space directly used by @var{x}, not +;;> counting any elements of @var{x}. + +;;> @subsubsubsection{@scheme{(integer->immediate n)}} + +;;> Returns the interpretation of the integer @var{n} as +;;> an immediate object, useful for debugging. + +;;> @subsubsubsection{@scheme{(string-contains str pat)}} + +;;> Returns the first string cursor of @var{pat} in @var{str}, +;;> of @scheme{#f} if it's not found. diff --git a/lib/chibi/ast.sld b/lib/chibi/ast.sld new file mode 100644 index 00000000..74b90c16 --- /dev/null +++ b/lib/chibi/ast.sld @@ -0,0 +1,40 @@ + +(define-library (chibi ast) + (export + analyze optimize env-cell ast->sexp macroexpand type-of + Object Input-Port Output-Port Opcode Procedure Bytecode Macro Env + Number Bignum Flonum Integer Char Boolean + Symbol String Byte-Vector Vector Pair + Context Lam Cnd Set Ref Seq Lit Sc Exception + syntactic-closure? lambda? cnd? set? ref? seq? lit? type? + environment? bytecode? exception? macro? context? + syntactic-closure-expr syntactic-closure-env syntactic-closure-vars + copy-lambda make-lambda make-cnd make-ref make-set make-seq make-lit + lambda-name lambda-params lambda-body lambda-defs lambda-locals + lambda-flags lambda-free-vars lambda-set-vars lambda-return-type + lambda-param-types lambda-source + lambda-name-set! lambda-params-set! lambda-body-set! lambda-defs-set! + lambda-locals-set! lambda-flags-set! lambda-free-vars-set! + lambda-set-vars-set! lambda-return-type-set! lambda-param-types-set! + lambda-source-set! + cnd-test cnd-pass cnd-fail + cnd-test-set! cnd-pass-set! cnd-fail-set! + set-var set-value set-var-set! set-value-set! + ref-name ref-cell ref-name-set! ref-cell-set! + seq-ls seq-ls-set! lit-value lit-value-set! + exception-kind exception-message exception-irritants + opcode-name opcode-num-params opcode-return-type opcode-param-type + opcode-class opcode-code opcode-data opcode-variadic? + macro-procedure macro-env macro-source + procedure-code procedure-vars procedure-name procedure-name-set! + bytecode-name bytecode-literals bytecode-source + pair-source pair-source-set! + port-line port-line-set! + environment-parent + type-name type-cpl type-parent type-slots type-num-slots type-printer + object-size integer->immediate gc + string-contains integer->error-string + flatten-dot update-free-vars!) + (import (scheme)) + (include-shared "ast") + (include "ast.scm")) diff --git a/lib/chibi/base64.scm b/lib/chibi/base64.scm new file mode 100644 index 00000000..3d95ad71 --- /dev/null +++ b/lib/chibi/base64.scm @@ -0,0 +1,351 @@ +;; Copyright (c) 2005-2009 Alex Shinn. All rights reserved. +;; BSD-style license: http://synthcode.com/license.txt + +;; Procedure: base64-encode-string str +;; Return a base64 encoded representation of string according to the +;; official base64 standard as described in RFC3548. + +;; Procedure: base64-decode-string str +;; Return a base64 decoded representation of string, also interpreting +;; the alternate 62 & 63 valued characters as described in RFC3548. +;; Other out-of-band characters are silently stripped, and = signals +;; the end of the encoded string. No errors will be raised. + +;; Procedure: base64-encode [port] +;; Procedure: base64-decode [port] +;; Variations of the above which read and write to ports. + +;; Procedure: base64-encode-header enc str [start-col max-col nl] +;; Return a base64 encoded representation of string as above, +;; wrapped in =?ENC?B?...?= as per RFC1522, split across multiple +;; MIME-header lines as needed to keep each lines length less than +;; MAX-COL. The string is encoded as is, and the encoding ENC is +;; just used for the prefix, i.e. you are responsible for ensuring +;; STR is already encoded according to ENC. The optional argument +;; NL is the newline separator, defaulting to CRLF. + +;; This API is compatible with the Gauche library rfc.base64. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; string utils + +(define (string-chop str n) + (let ((len (string-length str))) + (let lp ((i 0) (res '())) + (let ((j (+ i n))) + (if (>= j len) + (reverse (cons (substring str i len) res)) + (lp j (cons (substring str i j) res))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; constants and tables + +(define *default-max-col* 76) + +(define *outside-char* 99) ; luft-balloons +(define *pad-char* 101) ; dalmations + +(define *base64-decode-table* + (let ((res (make-vector #x100 *outside-char*))) + (let lp ((i 0)) ; map letters + (cond + ((<= i 25) + (vector-set! res (+ i 65) i) + (vector-set! res (+ i 97) (+ i 26)) + (lp (+ i 1))))) + (let lp ((i 0)) ; map numbers + (cond + ((<= i 9) + (vector-set! res (+ i 48) (+ i 52)) + (lp (+ i 1))))) + ;; extras (be liberal for different common base64 formats) + (vector-set! res (char->integer #\+) 62) + (vector-set! res (char->integer #\-) 62) + (vector-set! res (char->integer #\/) 63) + (vector-set! res (char->integer #\_) 63) + (vector-set! res (char->integer #\~) 63) + (vector-set! res (char->integer #\=) *pad-char*) + res)) + +(define (base64-decode-char c) + (vector-ref *base64-decode-table* (char->integer c))) + +(define *base64-encode-table* + (let ((res (make-vector 64))) + (let lp ((i 0)) ; map letters + (cond + ((<= i 25) + (vector-set! res i (integer->char (+ i 65))) + (vector-set! res (+ i 26) (integer->char (+ i 97))) + (lp (+ i 1))))) + (let lp ((i 0)) ; map numbers + (cond + ((<= i 9) + (vector-set! res (+ i 52) (integer->char (+ i 48))) + (lp (+ i 1))))) + (vector-set! res 62 #\+) + (vector-set! res 63 #\/) + res)) + +(define (enc i) + (vector-ref *base64-encode-table* i)) + +;; try to match common boundaries +(define decode-src-length + (lcm 76 78)) + +(define decode-dst-length + (* 3 (arithmetic-shift (+ 3 decode-src-length) -2))) + +(define encode-src-length + (* 3 1024)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; decoding + +;; Create a result buffer with the maximum possible length for the +;; input, and pass it to the internal base64-decode-string! utility. +;; If the resulting length used is exact, we can return that buffer, +;; otherwise we return the appropriate substring. +(define (base64-decode-string src) + (let* ((len (string-length src)) + (dst-len (* 3 (arithmetic-shift (+ 3 len) -2))) + (dst (make-string dst-len))) + (base64-decode-string! + src 0 len dst + (lambda (src-offset res-len b1 b2 b3) + (let ((res-len (base64-decode-finish dst res-len b1 b2 b3))) + (if (= res-len dst-len) + dst + (substring dst 0 res-len))))))) + +;; This is a little funky. +;; +;; We want to skip over "outside" characters (e.g. newlines inside +;; base64-encoded data, as would be passed in mail clients and most +;; large base64 data). This would normally mean two nested loops - +;; one for overall processing the input, and one for looping until +;; we get to a valid character. However, many Scheme compilers are +;; really bad about optimizing nested loops of primitives, so we +;; flatten this into a single loop, using conditionals to determine +;; which character is currently being read. +(define (base64-decode-string! src start end dst kont) + (let lp ((i start) + (j 0) + (b1 *outside-char*) + (b2 *outside-char*) + (b3 *outside-char*)) + (if (>= i end) + (kont i j b1 b2 b3) + (let ((c (base64-decode-char (string-ref src i)))) + (cond + ((eqv? c *pad-char*) + (kont i j b1 b2 b3)) + ((eqv? c *outside-char*) + (lp (+ i 1) j b1 b2 b3)) + ((eqv? b1 *outside-char*) + (lp (+ i 1) j c b2 b3)) + ((eqv? b2 *outside-char*) + (lp (+ i 1) j b1 c b3)) + ((eqv? b3 *outside-char*) + (lp (+ i 1) j b1 b2 c)) + (else + (string-set! dst + j + (integer->char + (bitwise-ior (arithmetic-shift b1 2) + (extract-bit-field 2 4 b2)))) + (string-set! dst + (+ j 1) + (integer->char + (bitwise-ior + (arithmetic-shift (extract-bit-field 4 0 b2) 4) + (extract-bit-field 4 2 b3)))) + (string-set! dst + (+ j 2) + (integer->char + (bitwise-ior + (arithmetic-shift (extract-bit-field 2 0 b3) 6) + c))) + (lp (+ i 1) (+ j 3) + *outside-char* *outside-char* *outside-char*))))))) + +;; If requested, account for any "partial" results (i.e. trailing 2 or +;; 3 chars) by writing them into the destination (additional 1 or 2 +;; bytes) and returning the adjusted offset for how much data we've +;; written. +(define (base64-decode-finish dst j b1 b2 b3) + (cond + ((eqv? b1 *outside-char*) + j) + ((eqv? b2 *outside-char*) + (string-set! dst j (integer->char (arithmetic-shift b1 2))) + (+ j 1)) + (else + (string-set! dst + j + (integer->char + (bitwise-ior (arithmetic-shift b1 2) + (extract-bit-field 2 4 b2)))) + (cond + ((eqv? b3 *outside-char*) + (+ j 1)) + (else + (string-set! dst + (+ j 1) + (integer->char + (bitwise-ior + (arithmetic-shift (extract-bit-field 4 0 b2) 4) + (extract-bit-field 4 2 b3)))) + (+ j 2)))))) + +;; General port decoder: work in single blocks at a time to avoid +;; allocating memory (crucial for Scheme implementations that don't +;; allow large strings). +(define (base64-decode . o) + (let ((in (if (pair? o) (car o) (current-input-port))) + (out (if (and (pair? o) (pair? (cdr o))) + (cadr o) + (current-output-port)))) + (let ((src (make-string decode-src-length)) + (dst (make-string decode-dst-length))) + (let lp ((offset 0)) + (let ((src-len (+ offset + (read-string! decode-src-length src in offset)))) + (cond + ((= src-len decode-src-length) + ;; read a full chunk: decode, write and loop + (base64-decode-string! + src 0 decode-src-length dst + (lambda (src-offset dst-len b1 b2 b3) + (cond + ((and (< src-offset src-len) + (eqv? #\= (string-ref src src-offset))) + ;; done + (let ((dst-len (base64-decode-finish dst dst-len b1 b2 b3))) + (write-string dst dst-len out))) + ((eqv? b1 *outside-char*) + (write-string dst dst-len out) + (lp 0)) + (else + (write-string dst dst-len out) + ;; one to three chars left in buffer + (string-set! src 0 (enc b1)) + (cond + ((eqv? b2 *outside-char*) + (lp 1)) + (else + (string-set! src 1 (enc b2)) + (cond + ((eqv? b3 *outside-char*) + (lp 2)) + (else + (string-set! src 2 (enc b3)) + (lp 3)))))))))) + (else + ;; end of source - just decode and write once + (base64-decode-string! + src 0 src-len dst + (lambda (src-offset dst-len b1 b2 b3) + (let ((dst-len (base64-decode-finish dst dst-len b1 b2 b3))) + (write-string dst dst-len out))))))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; encoding + +(define (base64-encode-string str) + (let* ((len (string-length str)) + (quot (quotient len 3)) + (rem (- len (* quot 3))) + (res-len (arithmetic-shift (+ quot (if (zero? rem) 0 1)) 2)) + (res (make-string res-len))) + (base64-encode-string! str 0 len res) + res)) + +(define (base64-encode-string! str start end res) + (let* ((res-len (string-length res)) + (limit (- end 2))) + (let lp ((i start) (j 0)) + (if (>= i limit) + (case (- end i) + ((1) + (let ((b1 (char->integer (string-ref str i)))) + (string-set! res j (enc (arithmetic-shift b1 -2))) + (string-set! res + (+ j 1) + (enc (arithmetic-shift (bitwise-and #b11 b1) 4))) + (string-set! res (+ j 2) #\=) + (string-set! res (+ j 3) #\=))) + ((2) + (let ((b1 (char->integer (string-ref str i))) + (b2 (char->integer (string-ref str (+ i 1))))) + (string-set! res j (enc (arithmetic-shift b1 -2))) + (string-set! res + (+ j 1) + (enc (bitwise-ior + (arithmetic-shift (bitwise-and #b11 b1) 4) + (extract-bit-field 4 4 b2)))) + (string-set! res + (+ j 2) + (enc (arithmetic-shift (extract-bit-field 4 0 b2) + 2))) + (string-set! res (+ j 3) #\=)))) + (let ((b1 (char->integer (string-ref str i))) + (b2 (char->integer (string-ref str (+ i 1)))) + (b3 (char->integer (string-ref str (+ i 2))))) + (string-set! res j (enc (arithmetic-shift b1 -2))) + (string-set! res + (+ j 1) + (enc (bitwise-ior + (arithmetic-shift (bitwise-and #b11 b1) 4) + (extract-bit-field 4 4 b2)))) + (string-set! res + (+ j 2) + (enc (bitwise-ior + (arithmetic-shift (extract-bit-field 4 0 b2) 2) + (extract-bit-field 2 6 b3)))) + (string-set! res (+ j 3) (enc (bitwise-and #b111111 b3))) + (lp (+ i 3) (+ j 4))))))) + +(define (base64-encode . o) + (let ((in (if (pair? o) (car o) (current-input-port))) + (out (if (and (pair? o) (pair? (cdr o))) + (cadr o) + (current-output-port)))) + (let ((src (make-string encode-src-length)) + (dst (make-string + (arithmetic-shift (quotient encode-src-length 3) 2)))) + (let lp () + (let ((n (read-string! 2048 src in))) + (base64-encode-string! src 0 n dst) + (write-string dst (* 3 (quotient (+ n 3) 4)) out) + (if (= n 2048) + (lp))))))) + +(define (base64-encode-header encoding str . o) + (define (round4 i) (arithmetic-shift (arithmetic-shift i -2) 2)) + (let ((start-col (if (pair? o) (car o) 0)) + (max-col (if (and (pair? o) (pair? (cdr o))) + (car (cdr o)) + *default-max-col*)) + (nl (if (and (pair? o) (pair? (cdr o)) (pair? (cdr (cdr o)))) + (car (cdr (cdr o))) + "\r\n"))) + (let* ((prefix (string-append "=?" encoding "?B?")) + (prefix-length (+ 2 (string-length prefix))) + (effective-max-col (round4 (- max-col prefix-length))) + (first-max-col (round4 (- effective-max-col start-col))) + (str (base64-encode-string str)) + (len (string-length str))) + (if (<= len first-max-col) + (string-append prefix str "?=") + (string-append + (if (positive? first-max-col) + (string-append + prefix (substring str 0 first-max-col) "?=" nl "\t" prefix) + "") + (string-concatenate (string-chop (substring str first-max-col len) + effective-max-col) + (string-append "?=" nl "\t" prefix)) + "?="))))) + diff --git a/lib/chibi/base64.sld b/lib/chibi/base64.sld new file mode 100644 index 00000000..e8e55db2 --- /dev/null +++ b/lib/chibi/base64.sld @@ -0,0 +1,7 @@ + +(define-library (chibi base64) + (export base64-encode base64-encode-string + base64-decode base64-decode-string + base64-encode-header) + (import (scheme) (srfi 33) (chibi io)) + (include "base64.scm")) diff --git a/lib/chibi/disasm.c b/lib/chibi/disasm.c new file mode 100644 index 00000000..edf4fa4f --- /dev/null +++ b/lib/chibi/disasm.c @@ -0,0 +1,202 @@ +/* disasm.c -- optional debugging utilities */ +/* Copyright (c) 2009-2011 Alex Shinn. All rights reserved. */ +/* BSD-style license: http://synthcode.com/license.txt */ + +#include "chibi/eval.h" +#include "../../opt/opcode_names.h" + +#define SEXP_DISASM_MAX_DEPTH 16 +#define SEXP_DISASM_PAD_WIDTH 4 + +#if SEXP_64_BIT +#define SEXP_PRId "%ld" +#else +#define SEXP_PRId "%d" +#endif + +static void sexp_write_pointer (sexp ctx, void *p, sexp out) { + char buf[32]; + sprintf(buf, "%p", p); + sexp_write_string(ctx, buf, out); +} + +static void sexp_write_integer (sexp ctx, sexp_sint_t n, sexp out) { + char buf[32]; + sprintf(buf, SEXP_PRId, n); + sexp_write_string(ctx, buf, out); +} + +static sexp disasm (sexp ctx, sexp self, sexp bc, sexp out, int depth) { + unsigned char *ip, opcode, i; + sexp tmp=NULL; + sexp_sint_t *labels, label=1, off; + + if (sexp_procedurep(bc)) { + bc = sexp_procedure_code(bc); + } else if (sexp_opcodep(bc)) { + sexp_write(ctx, sexp_opcode_name(bc), out); + sexp_write_string(ctx, " is a primitive\n", out); + return SEXP_VOID; + } else if (! sexp_bytecodep(bc)) { + return sexp_type_exception(ctx, self, SEXP_BYTECODE, bc); + } + if (! sexp_oportp(out)) { + return sexp_type_exception(ctx, self, SEXP_OPORT, out); + } + + for (i=0; i<(depth*SEXP_DISASM_PAD_WIDTH); i++) + sexp_write_char(ctx, ' ', out); + sexp_write_string(ctx, " -------------- ", out); + if (sexp_truep(sexp_bytecode_name(bc))) { + sexp_write(ctx, sexp_bytecode_name(bc), out); + sexp_write_char(ctx, ' ', out); + } + sexp_write_pointer(ctx, bc, out); + sexp_newline(ctx, out); + + /* build a table of labels that are jumped to */ + labels = calloc(sexp_bytecode_length(bc), sizeof(sexp_sint_t)); + ip = sexp_bytecode_data(bc); + while (ip - sexp_bytecode_data(bc) < sexp_bytecode_length(bc)) { + switch (*ip++) { + case SEXP_OP_JUMP: + case SEXP_OP_JUMP_UNLESS: + off = ip - sexp_bytecode_data(bc) + ((sexp_sint_t*)ip)[0]; + if (off >= 0 && off < sexp_bytecode_length(bc) && labels[off] == 0) + labels[off] = label++; + case SEXP_OP_CALL: + case SEXP_OP_CLOSURE_REF: + case SEXP_OP_GLOBAL_KNOWN_REF: + case SEXP_OP_GLOBAL_REF: + case SEXP_OP_LOCAL_REF: + case SEXP_OP_LOCAL_SET: + case SEXP_OP_PARAMETER_REF: + case SEXP_OP_PUSH: + case SEXP_OP_RESERVE: + case SEXP_OP_STACK_REF: + case SEXP_OP_TAIL_CALL: + case SEXP_OP_TYPEP: + ip += sizeof(sexp); + break; + case SEXP_OP_SLOT_REF: + case SEXP_OP_SLOT_SET: + case SEXP_OP_MAKE: + ip += sizeof(sexp)*2; + break; + case SEXP_OP_MAKE_PROCEDURE: + ip += sizeof(sexp)*3; + break; + default: + /* opcode takes no additional instruction args */ + break; + } + } + + ip = sexp_bytecode_data(bc); + loop: + for (i=0; i<(depth*SEXP_DISASM_PAD_WIDTH); i++) + sexp_write_char(ctx, ' ', out); + if (labels[ip - sexp_bytecode_data(bc)] == 0) { + sexp_write_string(ctx, " ", out); + } else { + sexp_write_char(ctx, 'L', out); + sexp_write_integer(ctx, labels[ip - sexp_bytecode_data(bc)], out); + sexp_write_string(ctx, ": ", out); + if (labels[ip - sexp_bytecode_data(bc)] < 10) + sexp_write_char(ctx, ' ', out); + } + opcode = *ip++; + if (opcode*sizeof(char*) < sizeof(reverse_opcode_names)) { + sexp_write_char(ctx, ' ', out); + sexp_write_string(ctx, reverse_opcode_names[opcode], out); + sexp_write_char(ctx, ' ', out); + } else { + sexp_write_string(ctx, " ", out); + sexp_write(ctx, sexp_make_fixnum(opcode), out); + sexp_write_char(ctx, ' ', out); + } + switch (opcode) { + case SEXP_OP_STACK_REF: + case SEXP_OP_LOCAL_REF: + case SEXP_OP_LOCAL_SET: + case SEXP_OP_CLOSURE_REF: + case SEXP_OP_TYPEP: + case SEXP_OP_RESERVE: + sexp_write_integer(ctx, ((sexp_sint_t*)ip)[0], out); + ip += sizeof(sexp); + break; + case SEXP_OP_JUMP: + case SEXP_OP_JUMP_UNLESS: + sexp_write_integer(ctx, ((sexp_sint_t*)ip)[0], out); + off = ip - sexp_bytecode_data(bc) + ((sexp_sint_t*)ip)[0]; + if (off >= 0 && off < sexp_bytecode_length(bc) && labels[off] > 0) { + sexp_write_string(ctx, " L", out); + sexp_write_integer(ctx, labels[off], out); + } + ip += sizeof(sexp); + break; + case SEXP_OP_FCALL0: + case SEXP_OP_FCALL1: + case SEXP_OP_FCALL2: + case SEXP_OP_FCALL3: + case SEXP_OP_FCALL4: + sexp_write_pointer(ctx, ((sexp*)ip)[0], out); + sexp_write_char(ctx, ' ', out); + sexp_write(ctx, sexp_opcode_name(((sexp*)ip)[0]), out); + ip += sizeof(sexp); + break; + case SEXP_OP_SLOT_REF: + case SEXP_OP_SLOT_SET: + case SEXP_OP_MAKE: + ip += sizeof(sexp)*2; + break; + case SEXP_OP_MAKE_PROCEDURE: + sexp_write_integer(ctx, ((sexp_sint_t*)ip)[0], out); + sexp_write_char(ctx, ' ', out); + sexp_write_integer(ctx, ((sexp_sint_t*)ip)[1], out); + tmp = ((sexp*)ip)[2]; + ip += sizeof(sexp)*3; + break; + case SEXP_OP_GLOBAL_REF: + case SEXP_OP_GLOBAL_KNOWN_REF: + case SEXP_OP_PARAMETER_REF: + case SEXP_OP_TAIL_CALL: + case SEXP_OP_CALL: + case SEXP_OP_PUSH: + tmp = ((sexp*)ip)[0]; + if (((opcode == SEXP_OP_GLOBAL_REF) || (opcode == SEXP_OP_GLOBAL_KNOWN_REF)) + && sexp_pairp(tmp)) + tmp = sexp_car(tmp); + else if ((opcode == SEXP_OP_PARAMETER_REF) + && sexp_opcodep(tmp) && sexp_opcode_data(tmp) + && sexp_pairp(sexp_opcode_data(tmp))) + tmp = sexp_car(sexp_opcode_data(tmp)); + else if ((opcode == SEXP_OP_PUSH) && (sexp_pairp(tmp) || sexp_idp(tmp))) + sexp_write_char(ctx, '\'', out); + sexp_write(ctx, tmp, out); + ip += sizeof(sexp); + break; + } + sexp_write_char(ctx, '\n', out); + if ((opcode == SEXP_OP_PUSH || opcode == SEXP_OP_MAKE_PROCEDURE) + && (depth < SEXP_DISASM_MAX_DEPTH) + && tmp && (sexp_bytecodep(tmp) || sexp_procedurep(tmp))) + disasm(ctx, self, tmp, out, depth+1); + if (ip - sexp_bytecode_data(bc) < sexp_bytecode_length(bc)) + goto loop; + + free(labels); + return SEXP_VOID; +} + +static sexp sexp_disasm (sexp ctx, sexp self, sexp_sint_t n, sexp bc, sexp out) { + return disasm(ctx, self, bc, out, 0); +} + +sexp sexp_init_library (sexp ctx, sexp self, sexp_sint_t n, sexp env, const char* version, sexp_abi_identifier_t abi) { + if (!(sexp_version_compatible(ctx, version, sexp_version) + && sexp_abi_compatible(ctx, abi, SEXP_ABI_IDENTIFIER))) + return sexp_global(ctx, SEXP_G_ABI_ERROR); + sexp_define_foreign_param(ctx, env, "disasm", 2, (sexp_proc1)sexp_disasm, "current-output-port"); + return SEXP_VOID; +} diff --git a/lib/chibi/disasm.sld b/lib/chibi/disasm.sld new file mode 100644 index 00000000..cb31ec79 --- /dev/null +++ b/lib/chibi/disasm.sld @@ -0,0 +1,10 @@ + +;;> @subsubsubsection{(disasm f [out])} + +;;> Write a human-readable disassembly for the procedure @var{f} to +;;> the port @var{out}, defaulting to @scheme{(current-output-port)}. + +(define-library (chibi disasm) + (export disasm) + (import (scheme)) + (include-shared "disasm")) diff --git a/lib/chibi/equiv.scm b/lib/chibi/equiv.scm new file mode 100644 index 00000000..ee6f073e --- /dev/null +++ b/lib/chibi/equiv.scm @@ -0,0 +1,49 @@ + +;;> Cycle-aware equality. Returns @scheme{#t} iff @scheme{a} and +;;> @scheme{b} are @scheme{equal?}, including cycles. Another way +;;> to think of it is they are @scheme{equiv} if they print the +;;> same, assuming all elements can be printed. + +(define (equiv? a b) + (let ((equivs (make-hash-table eq?))) + (define (get-equivs x) + (or (hash-table-ref/default equivs x #f) + (let ((tmp (make-hash-table eq?))) + (hash-table-set! equivs x tmp) + tmp))) + (define (merge! tab x) + (hash-table-set! tab x tab) + (cond ((hash-table-ref/default equivs x #f) + => (lambda (tab2) + (hash-table-walk tab2 (lambda (key value) + (hash-table-set! tab key tab))))))) + (define (equiv? a b) + (cond + ((eq? a b)) + ((pair? a) + (and (pair? b) + (let ((a-tab (get-equivs a))) + (hash-table-ref + a-tab + b + (lambda () + (merge! a-tab b) + (and (equiv? (car a) (car b)) + (equiv? (cdr a) (cdr b)))))))) + ((vector? a) + (and (vector? b) + (= (vector-length a) (vector-length b)) + (let ((a-tab (get-equivs a))) + (hash-table-ref + a-tab + b + (lambda () + (merge! a-tab b) + (let lp ((i (- (vector-length a) 1))) + (or (< i 0) + (and (equiv? (vector-ref a i) (vector-ref b i)) + (lp (- i 1)))))))))) + (else + (equal? a b)))) + (let ((res (equal?/bounded a b 1000000))) + (and res (or (> res 0) (equiv? a b)) #t)))) diff --git a/lib/chibi/equiv.sld b/lib/chibi/equiv.sld new file mode 100644 index 00000000..ba16814b --- /dev/null +++ b/lib/chibi/equiv.sld @@ -0,0 +1,6 @@ + +(define-library (chibi equiv) + (export equiv?) + (import (scheme)) + (import (srfi 69)) + (include "equiv.scm")) diff --git a/lib/chibi/filesystem.scm b/lib/chibi/filesystem.scm new file mode 100644 index 00000000..bae76556 --- /dev/null +++ b/lib/chibi/filesystem.scm @@ -0,0 +1,68 @@ +;; filesystem.scm -- additional filesystem utilities +;; Copyright (c) 2009-2011 Alex Shinn. All rights reserved. +;; BSD-style license: http://synthcode.com/license.txt + +;;> The fundamental directory iterator. Applies @var{kons} to +;;> each filename in directory @var{dir} and the result of the +;;> previous application, beginning with @var{knil}. With +;;> @var{kons} as @scheme{cons} and @var{knil} as @scheme{'()}, +;;> equivalent to @scheme{directory-files}. + +(define (directory-fold dir kons knil) + (let ((dir (opendir dir))) + (let lp ((res knil)) + (let ((file (readdir dir))) + (if file (lp (kons (dirent-name file) res)) res))))) + +;;> Returns a list of the files in @var{dir} in an unspecified +;;> order. + +(define (directory-files dir) + (directory-fold dir cons '())) + +;;> Returns the @scheme{status} object for the given @var{file}, +;;> which should be a string indicating the path or a file +;;> descriptor. + +(define (file-status file) + (if (string? file) (stat file) (fstat file))) + +(define (file-device x) (stat-dev (if (stat? x) x (file-status x)))) +(define (file-inode x) (stat-ino (if (stat? x) x (file-status x)))) +(define (file-mode x) (stat-mode (if (stat? x) x (file-status x)))) +(define (file-num-links x) (stat-nlinks (if (stat? x) x (file-status x)))) +(define (file-owner x) (stat-uid (if (stat? x) x (file-status x)))) +(define (file-group x) (stat-gid (if (stat? x) x (file-status x)))) +(define (file-represented-device x) (stat-rdev (if (stat? x) x (file-status x)))) +(define (file-size x) (stat-size (if (stat? x) x (file-status x)))) +(define (file-block-size x) (stat-blksize (if (stat? x) x (file-status x)))) +(define (file-num-blocks x) (stat-blocks (if (stat? x) x (file-status x)))) +(define (file-access-time x) (stat-atime (if (stat? x) x (file-status x)))) +(define (file-modification-time x) (stat-mtime (if (stat? x) x (file-status x)))) +(define (file-change-time x) (stat-ctime (if (stat? x) x (file-status x)))) + +;;> File status accessors. @var{x} should be a string indicating +;;> the file to lookup the status for, or an existing status object. +;;/ + +(define (file-regular? x) (S_ISREG (file-mode x))) +(define (file-directory? x) (S_ISDIR (file-mode x))) +(define (file-character? x) (S_ISCHR (file-mode x))) +(define (file-block? x) (S_ISBLK (file-mode x))) +(define (file-fifo? x) (S_ISFIFO (file-mode x))) +(define (file-link? x) (S_ISLNK (file-mode x))) +(define (file-socket? x) (S_ISSOCK (file-mode x))) +(define (file-exists? x) (and (file-status x) #t)) + +;;> File type tests. @var{x} should be a string indicating the +;;> file to lookup the status for, or an existing status object. +;;> Returns @scheme{#t} if the file exists and the given type +;;> is satisfied, and @scheme{#f} otherwise. +;;/ + +;;> Equivalent to duplicating the file descriptor @var{old} to +;;> @var{new} and closing @var{old}. + +(define (renumber-file-descriptor old new) + (and (duplicate-file-descriptor-to old new) + (close-file-descriptor old))) diff --git a/lib/chibi/filesystem.sld b/lib/chibi/filesystem.sld new file mode 100644 index 00000000..e00ab8cd --- /dev/null +++ b/lib/chibi/filesystem.sld @@ -0,0 +1,34 @@ + +;;> Interface to the filesystem and file descriptor objects. +;;> Note that file descriptors are currently represented as +;;> integers, but may be replaced with opaque (and gc-managed) +;;> objects in a future release. + +(define-library (chibi filesystem) + (export open-input-file-descriptor open-output-file-descriptor + open-input-output-file-descriptor + duplicate-file-descriptor duplicate-file-descriptor-to + close-file-descriptor renumber-file-descriptor + delete-file link-file symbolic-link-file rename-file + directory-files directory-fold create-directory delete-directory + open open-pipe make-fifo + file-status + file-device file-inode + file-mode file-num-links + file-owner file-group + file-represented-device file-size + file-block-size file-num-blocks + file-access-time file-modification-time file-change-time + file-regular? file-directory? file-character? + file-block? file-fifo? file-link? + file-socket? file-exists? + get-file-descriptor-flags set-file-descriptor-flags! + get-file-descriptor-status set-file-descriptor-status! + open/read open/write open/read-write + open/create open/exclusive open/truncate + open/append open/non-block + is-a-tty?) + (import (scheme)) + (include-shared "filesystem") + (include "filesystem.scm")) + diff --git a/lib/chibi/filesystem.stub b/lib/chibi/filesystem.stub new file mode 100644 index 00000000..c90ab69f --- /dev/null +++ b/lib/chibi/filesystem.stub @@ -0,0 +1,190 @@ +;; filesystem.stub -- filesystem bindings +;; Copyright (c) 2009-2012 Alex Shinn. All rights reserved. +;; BSD-style license: http://synthcode.com/license.txt + +(c-system-include "sys/types.h") +(c-system-include "unistd.h") +(c-system-include "dirent.h") +(c-system-include "fcntl.h") + +(define-c-type DIR + finalizer: closedir) + +(define-c-struct dirent + (string d_name dirent-name)) + +(define-c-struct stat + predicate: stat? + (dev_t st_dev stat-dev) + (ino_t st_ino stat-ino) + (mode_t st_mode stat-mode) + (nlink_t st_nlink stat-nlinks) + (uid_t st_uid stat-uid) + (gid_t st_gid stat-gid) + (dev_t st_rdev stat-rdev) + (off_t st_size stat-size) + (blksize_t st_blksize stat-blksize) + (blkcnt_t st_blocks stat-blocks) + (time_t st_atime stat-atime) + (time_t st_mtime stat-mtime) + (time_t st_ctime stat-ctime)) + +(define-c boolean S_ISREG (mode_t)) +(define-c boolean S_ISDIR (mode_t)) +(define-c boolean S_ISCHR (mode_t)) +(define-c boolean S_ISBLK (mode_t)) +(define-c boolean S_ISFIFO (mode_t)) +(define-c boolean S_ISLNK (mode_t)) +(define-c boolean S_ISSOCK (mode_t)) + +;;(define-c-const int ("S_IFMT")) +(define-c-const int (file/socket "S_IFSOCK")) +(define-c-const int (file/link "S_IFLNK")) +(define-c-const int (file/regular "S_IFREG")) +(define-c-const int (file/block "S_IFBLK")) +(define-c-const int (file/directory "S_IFDIR")) +(define-c-const int (file/character "S_IFCHR")) +(define-c-const int (file/fifo "S_IFIFO")) +(define-c-const int (file/suid "S_ISUID")) +(define-c-const int (file/sgid "S_ISGID")) +(define-c-const int (file/sticky "S_ISVTX")) +;;(define-c-const int ("S_IRWXU")) +(define-c-const int (perm/user-read "S_IRUSR")) +(define-c-const int (perm/user-write "S_IWUSR")) +(define-c-const int (perm/user-execute "S_IXUSR")) +;;(define-c-const int ("S_IRWXG")) +(define-c-const int (perm/group-read "S_IRGRP")) +(define-c-const int (perm/group-write "S_IWGRP")) +(define-c-const int (perm/group-execute "S_IXGRP")) +;;(define-c-const int ("S_IRWXO")) +(define-c-const int (perm/others-read "S_IROTH")) +(define-c-const int (perm/others-write "S_IWOTH")) +(define-c-const int (perm/others-execute "S_IXOTH")) + +(define-c errno stat (string (result stat))) +(define-c errno fstat (int (result stat))) +(define-c errno (file-link-status "lstat") (string (result stat))) + +;;> Creates a new input-port from the file descriptor @var{int}. + +(define-c input-port (open-input-file-descriptor "fdopen") + (int (value "r" string))) + +;;> Creates a new output-port from the file descriptor @var{int}. + +(define-c output-port (open-output-file-descriptor "fdopen") + (int (value "w" string))) + +;;> Creates a new bidirectional port from the file descriptor @var{int}. + +(define-c input-output-port (open-input-output-file-descriptor "fdopen") + (int (value "r+" string))) + +;;> Unlinks the file named @var{string} from the filesystem. +;;> Returns @scheme{#t} on success and @scheme{#f} on failure. + +(define-c errno (delete-file "unlink") (string)) + +;;> Creates a hard link to the first arg from the second. +;;> Returns @scheme{#t} on success and @scheme{#f} on failure. + +(define-c errno (link-file "link") (string string)) + +;;> Creates a symbolic link to the first arg from the second. +;;> Returns @scheme{#t} on success and @scheme{#f} on failure. + +(define-c errno (symbolic-link-file "symlink") (string string)) + +;;> Renames the first arg to the second. +;;> Returns @scheme{#t} on success and @scheme{#f} on failure. + +(define-c errno (rename-file "rename") (string string)) + +;;> Returns the current working directory of the process as a string. + +(define-c non-null-string (current-directory "getcwd") + ((result (array char (auto-expand arg1))) (value 256 int))) + +;;> Creates a new directory with the given mode. +;;> Returns @scheme{#t} on success and @scheme{#f} on failure. + +(define-c errno (create-directory "mkdir") (string int)) + +;;> Deletes the directory named @var{string} from the filesystem. +;;> Does not attempt to delete recursively. +;;> Returns @scheme{#t} on success and @scheme{#f} on failure. + +(define-c errno (delete-directory "rmdir") (string)) + +(define-c (free DIR) opendir (string)) +(define-c dirent readdir ((link (pointer DIR)))) + +;;> Duplicates the given file descriptor, returning he new value, +;; or -1 on failure. + +(define-c int (duplicate-file-descriptor "dup") (int)) + +;;> Copies the first file descriptor to the second, closing +;;> it if needed. +;;> Returns @scheme{#t} on success and @scheme{#f} on failure. + +(define-c errno (duplicate-file-descriptor-to "dup2") (int int)) + +;;> Closes the given file descriptor. +;;> Returns @scheme{#t} on success and @scheme{#f} on failure. + +(define-c errno (close-file-descriptor "close") (int)) + +;;> Opens the given file and returns a file descriptor. + +(define-c int open (string int (default #o644 int))) + +;;> Returns a list of 2 new file descriptors, the input and +;;> output end of a new pipe, respectively. + +(define-c errno (open-pipe "pipe") ((result (array int 2)))) + +;;> Creates a new named pipe in the given path. +;;> Returns @scheme{#t} on success and @scheme{#f} on failure. + +(define-c errno (make-fifo "mkfifo") (string (default #o644 int))) + +(define-c int (get-file-descriptor-flags "fcntl") + (int (value F_GETFD int))) +(define-c errno (set-file-descriptor-flags! "fcntl") + (int (value F_SETFD int) long)) + +;;> Get and set the flags for the given file descriptor. +;;/ + +(define-c int (get-file-descriptor-status "fcntl") + (int (value F_GETFL int))) +(define-c errno (set-file-descriptor-status! "fcntl") + (int (value F_SETFL int) long)) + +;;> Get and set the status for the given file descriptor. +;;/ + +;; (define-c int (get-file-descriptor-lock "fcntl") +;; (int (value F_GETLK int) flock)) +;; (define-c errno (set-file-descriptor-lock! "fcntl") +;; (int (value F_SETLK int) flock)) +;; (define-c errno (try-set-file-descriptor-lock! "fcntl") +;; (int (value F_SETLKW int) flock)) + +(define-c-const int (open/read "O_RDONLY")) +(define-c-const int (open/write "O_WRONLY")) +(define-c-const int (open/read-write "O_RDWR")) +(define-c-const int (open/create "O_CREAT")) +(define-c-const int (open/exclusive "O_EXCL")) +(define-c-const int (open/truncate "O_TRUNC")) +(define-c-const int (open/append "O_APPEND")) +(define-c-const int (open/non-block "O_NONBLOCK")) + +;;> File opening modes. +;;/ + +;;> Returns @scheme{#t} if the given port of file descriptor +;;> if backed by a TTY object, and @scheme{#f} otherwise. + +(define-c boolean (is-a-tty? "isatty") (port-or-fd)) diff --git a/lib/chibi/generic.scm b/lib/chibi/generic.scm new file mode 100644 index 00000000..ea914de9 --- /dev/null +++ b/lib/chibi/generic.scm @@ -0,0 +1,93 @@ + +;;> Define a new generic function named @var{name}. + +(define-syntax define-generic + (syntax-rules () + ((define-generic name) + (define name (make-generic 'name))))) + +;; call-next-method needs to be unhygienic +'(define-syntax define-method + (syntax-rules () + ((define-method (name (param type) ...) . body) + (generic-add! name + (list type ...) + (lambda (next param ...) + (let-syntax ((call)) + . body)))))) + +;;> @subsubsubsection{(define-method (name (param type) ...) body ...)} + +;;> Extends the generic function @var{name} with a new method that +;;> applies when the given param types all match. + +(define-syntax define-method + (er-macro-transformer + (lambda (e r c) + (let ((name (caadr e)) + (params (cdadr e)) + (body (cddr e))) + `(,(r 'generic-add!) ,name + (,(r 'list) ,@(map cadr params)) + (,(r 'lambda) (next ,@(map car params)) + (,(r 'let-syntax) ((call-next-method + (,(r 'syntax-rules) () + ((_) (next))))) + ,@body))))))) + +(define (no-applicable-method-error name args) + (error "no applicable method" name args)) + +(define (satisfied? preds args) + (cond ((null? preds) (null? args)) + ((null? args) #f) + (((car preds) (car args)) (satisfied? (cdr preds) (cdr args))) + (else #f))) + +(define add-method-tag (list 'add-method-tag)) + +;;> Create a new first-class generic function named @var{name}. + +(define (make-generic name) + (let ((name name) + (methods (make-vector 6 '()))) + (vector-set! methods + 3 + (list (cons (list (lambda (x) (eq? x add-method-tag)) + (lambda (x) (list? x)) + procedure?) + (lambda (next t p f) + (set! methods (insert-method! methods p f)))))) + (lambda args + (let ((len (length args))) + (cond + ((>= len (vector-length methods)) + (no-applicable-method-error name args)) + (else + (let lp ((ls (vector-ref methods len))) + (cond + ((null? ls) + (no-applicable-method-error name args)) + ((satisfied? (car (car ls)) args) + (apply (cdr (car ls)) (lambda () (lp (cdr ls))) args)) + (else + (lp (cdr ls))))))))))) + +(define (insert-method! vec preds f) + (let ((vlen (vector-length vec)) + (plen (length preds))) + (let ((res (if (>= plen vlen) + (let ((r (make-vector (+ vlen 1) '()))) + (do ((i 0 (+ i 1))) + ((>= i vlen) r) + (vector-set! r i (vector-ref vec i)))) + vec))) + (vector-set! res plen (cons (cons preds f) (vector-ref res plen))) + res))) + +;;> Extend the generic @var{g} with a new method @var{f} +;;> that applies when all parameters match the given list +;;> of predicates @var{preds}. + +(define (generic-add! g preds f) + (g add-method-tag preds f)) diff --git a/lib/chibi/generic.sld b/lib/chibi/generic.sld new file mode 100644 index 00000000..0acb3d22 --- /dev/null +++ b/lib/chibi/generic.sld @@ -0,0 +1,7 @@ + +;;> Simple generic function interface. + +(define-library (chibi generic) + (export define-generic define-method make-generic generic-add!) + (import (scheme)) + (include "generic.scm")) diff --git a/lib/chibi/heap-stats.c b/lib/chibi/heap-stats.c new file mode 100644 index 00000000..af873ce2 --- /dev/null +++ b/lib/chibi/heap-stats.c @@ -0,0 +1,137 @@ +/* heap-stats.c -- count or dump heap objects */ +/* Copyright (c) 2009-2011 Alex Shinn. All rights reserved. */ +/* BSD-style license: http://synthcode.com/license.txt */ + +#include + +#define SEXP_HEAP_VECTOR_DEPTH 1 + +#if ! SEXP_USE_BOEHM + +extern sexp sexp_gc (sexp ctx, size_t *sum_freed); +extern sexp_uint_t sexp_allocated_bytes (sexp ctx, sexp x); + +static void sexp_print_simple (sexp ctx, sexp x, sexp out, int depth) { + int i; + if ((!sexp_pointerp(x)) || sexp_symbolp(x) || sexp_stringp(x) + || sexp_flonump(x) || sexp_bignump(x)) { + sexp_write(ctx, x, out); + } else if (depth <= 0) { + goto print_name; + } else if (sexp_synclop(x)) { + sexp_write_string(ctx, "#", out); + } else if (sexp_pairp(x)) { + sexp_write_char(ctx, '(', out); + sexp_print_simple(ctx, sexp_car(x), out, depth-1); + sexp_write_string(ctx, " . ", out); + sexp_print_simple(ctx, sexp_cdr(x), out, depth-1); + sexp_write_char(ctx, ')', out); + } else if (sexp_vectorp(x)) { + sexp_write_string(ctx, "#(", out); + for (i=0; i0) + sexp_write_char(ctx, ' ', out); + sexp_print_simple(ctx, sexp_vector_ref(x, i), out, depth-1); + } + if (i", out); + } +} + +static sexp sexp_heap_walk (sexp ctx, int depth, int printp) { + size_t freed; + sexp_uint_t stats[256], hi_type=0, i; + sexp_heap h = sexp_context_heap(ctx); + sexp p, out=SEXP_FALSE; + sexp_free_list q, r; + char *end; + sexp_gc_var3(res, tmp, name); + + if (printp) + out = sexp_parameter_ref(ctx, + sexp_env_ref(sexp_context_env(ctx), + sexp_global(ctx,SEXP_G_CUR_OUT_SYMBOL), + SEXP_FALSE)); + + /* run gc once to remove unused variables */ + sexp_gc(ctx, &freed); + + /* initialize stats */ + for (i=0; i<256; i++) stats[i]=0; + + /* loop over each heap chunk */ + for ( ; h; h=h->next) { + p = (sexp) (h->data + sexp_heap_align(sexp_sizeof(pair))); + q = h->free_list; + end = (char*)h->data + h->size; + while (((char*)p) < end) { + /* find the preceding and succeeding free list pointers */ + for (r=q->next; r && ((char*)r<(char*)p); q=r, r=r->next) + ; + if ((char*)r == (char*)p) { /* this is a free block, skip */ + p = (sexp) (((char*)p) + r->size); + continue; + } + /* otherwise maybe print, then increment the stat and continue */ + if (sexp_oportp(out)) { + sexp_print_simple(ctx, p, out, depth); + sexp_write_char(ctx, '\n', out); + } + stats[sexp_pointer_tag(p)]++; + if (sexp_pointer_tag(p) > hi_type) + hi_type = sexp_pointer_tag(p); + p = (sexp) (((char*)p) + sexp_heap_align(sexp_allocated_bytes(ctx, p))); + } + } + + /* build and return results */ + sexp_gc_preserve3(ctx, res, tmp, name); + res = SEXP_NULL; + for (i=hi_type; i>0; i--) + if (stats[i]) { + name = sexp_string_to_symbol(ctx, sexp_type_name_by_index(ctx, i)); + tmp = sexp_cons(ctx, name, sexp_make_fixnum(stats[i])); + res = sexp_cons(ctx, tmp, res); + } + sexp_gc_release3(ctx); + return res; +} + +static sexp sexp_heap_stats (sexp ctx, sexp self, sexp_sint_t n) { + return sexp_heap_walk(ctx, 0, 0); +} + +static sexp sexp_heap_dump (sexp ctx, sexp self, sexp_sint_t n, sexp depth) { + if (! sexp_fixnump(depth) || (sexp_unbox_fixnum(depth) < 0)) + return sexp_xtype_exception(ctx, self, "bad heap-dump depth", depth); + return sexp_heap_walk(ctx, sexp_unbox_fixnum(depth), 1); +} + +#else + +static sexp sexp_heap_stats (sexp ctx, sexp self, sexp_sint_t n) { + return SEXP_NULL; +} + +static sexp sexp_heap_dump (sexp ctx, sexp self, sexp_sint_t n, sexp depth) { + return SEXP_NULL; +} + +#endif + +sexp sexp_init_library (sexp ctx, sexp self, sexp_sint_t n, sexp env, const char* version, sexp_abi_identifier_t abi) { + if (!(sexp_version_compatible(ctx, version, sexp_version) + && sexp_abi_compatible(ctx, abi, SEXP_ABI_IDENTIFIER))) + return sexp_global(ctx, SEXP_G_ABI_ERROR); + sexp_define_foreign(ctx, env, "heap-stats", 0, sexp_heap_stats); + sexp_define_foreign_opt(ctx, env, "heap-dump", 1, sexp_heap_dump, SEXP_ONE); + return SEXP_VOID; +} diff --git a/lib/chibi/heap-stats.sld b/lib/chibi/heap-stats.sld new file mode 100644 index 00000000..2cba3013 --- /dev/null +++ b/lib/chibi/heap-stats.sld @@ -0,0 +1,24 @@ + +;;> Utilities for gathering statistics on the heap. Just measuring +;;> runtime memory usage doesn't give a good idea of how to optimize +;;> that usage, so this module is provided for profiling. + +;;> @subsubsubsection{(heap-stats)} + +;;> Returns an alist summarizing all heap allocated objects. The +;;> @var{car} of each cell is the type-name, and the @var{cdr} is the +;;> count of objects of that type in the heap. Garbage is collected +;;> before the counts are taken. + +;;> @subsubsubsection{(heap-dump [depth])} + +;;> Returns the same value as @scheme{(heap-stats)}, but also prints +;;> all objects on the heap as it runs. @var{depth} indicates the +;;> printing depth for compound objects and defaults to 1. + +;;> These functions just return @scheme{'()} when using the Boehm GC. + +(define-library (chibi heap-stats) + (export heap-stats heap-dump) + (import (scheme)) + (include-shared "heap-stats")) diff --git a/lib/chibi/highlight.scm b/lib/chibi/highlight.scm new file mode 100644 index 00000000..ffb8b545 --- /dev/null +++ b/lib/chibi/highlight.scm @@ -0,0 +1,453 @@ +;; highlight.scm -- source code highlighting library +;; Copyright (c) 2011 Alex Shinn. All rights reserved. +;; BSD-style license: http://synthcode.com/license.txt + +;;> Library for highlighting source code in different +;;> languages. Currently supports Scheme, C and Assembly. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define (string-concatenate-reverse ls) + (string-concatenate (reverse ls))) + +(define (reverse-list->string ls) + (list->string (reverse ls))) + +;;> Returns an sxml structure representing the code from source +;;> with various language constructs wrapped in highlighting +;;> forms. @var{source} should be a string or port. The +;;> language to highlight for is auto-detected. + +(define (highlight source) + (let ((str (if (string? source) source (port->string source)))) + ((highlighter-for (highlight-detect-language str)) str))) + +;;> Attempst to auto-detect which language @var{str} is code +;;> for, and returns a symbol representing that language. + +(define (highlight-detect-language str) + (cond + ((guard (exn (else #f)) + (call-with-input-string str + (lambda (in) (do ((x #f (read in))) ((eof-object? x))))) + #t) + 'scheme) + (else + 'c))) + +;;> Return a procedure for highlighting the given language. + +(define (highlighter-for language) + (case language + ((scheme) highlight-scheme) + ((asm) highlight-assembly) + ((none) (lambda (x) x)) + (else highlight-c))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define highlight-themes + '((light + (keyword . "#800080") + (type . "#008000") + (function . "#0000FF") + (variable . "#B8860B") + (comment . "#FF0000") + (string . "#BC8F8F") + (attribute . "#FF5000") + (preprocessor . "#FF00FF") + (builtin . "#FF00FF") + (character . "#0055AA") + (syntaxerror . "#FF0000") + (diff-deleted . "#5F2121") + (diff-added . "#215F21") + ))) + +(define highlight-paren-styles + ;;'("#BAFFFF" "#FFCACA" "#FFFFBA" "#CACAFF" "#CAFFCA" "FFBAFF") + '("#AAAAAA" "#888888" "#666666" "#444444" "#222222" "#000000")) + +;;> Returns a string representing the CSS needed for the output +;;> of @var{highlight}. This should be included in a referenced +;;> CSS file, or in a @var{